diff --git a/rule-server/src/static/archives.json b/rule-server/src/static/archives.json index a59208ab9..00bd94455 100644 --- a/rule-server/src/static/archives.json +++ b/rule-server/src/static/archives.json @@ -4,6 +4,12 @@ "name": "Latest Deployment", "path": "/archives/latest" }, + { + "id": "12December2024", + "name": "12 December 2024 Deployment (IBM 7.3)", + "version": "3.1.79", + "path": "/archives/2024.12.12" + }, { "id": "13November2024", "name": "13 November 2024 Deployment (IBM 7.3)", diff --git a/rule-server/src/static/archives/2024.12.12/doc/assets/NeedsReview16.svg b/rule-server/src/static/archives/2024.12.12/doc/assets/NeedsReview16.svg new file mode 100644 index 000000000..917834a38 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/assets/NeedsReview16.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/rule-server/src/static/archives/2024.12.12/doc/assets/Recommendation16.svg b/rule-server/src/static/archives/2024.12.12/doc/assets/Recommendation16.svg new file mode 100644 index 000000000..b57dc73d5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/assets/Recommendation16.svg @@ -0,0 +1,15 @@ + + + + + + +i + diff --git a/rule-server/src/static/archives/2024.12.12/doc/assets/Violation16.svg b/rule-server/src/static/archives/2024.12.12/doc/assets/Violation16.svg new file mode 100644 index 000000000..5f8c9c710 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/assets/Violation16.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/rule-server/src/static/archives/2024.12.12/doc/common/help.css b/rule-server/src/static/archives/2024.12.12/doc/common/help.css new file mode 100644 index 000000000..0db9f74b4 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/common/help.css @@ -0,0 +1,268 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +@import url("https://1.www.s81c.com/common/carbon-for-ibm-dotcom/tag/v1/latest/plex.css"); +@import url('https://unpkg.com/carbon-components/css/carbon-components.min.css'); +@import url("https://1.www.s81c.com/common/carbon-for-ibm-dotcom/tag/v1/latest/themes.css"); + +bx-list-item>code, p>code, td>code { + background-color: var(--cds-layer); + border-radius: 4px; + bottom: 0.0625em; + color: var(--cds-text-primary); + display: inline; + font-size: .75rem; + font-size: .875em; + font-weight: 400; + letter-spacing: .32px; + line-height: 1.33333; + padding: 0 0.5em; + position: relative; +} + +.toolHelp a { + color: var(--cds-link-primary) +} + +.toolHelp .toolMain p ~ p { + margin-top: .5rem; +} + +.toolHelp .toolHead h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +.toolHelp .toolHead .issueLevel { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; +} + +.toolHelp .toolHead #ruleMessage { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; + margin-top: .5rem; + margin-bottom: .5rem; +} + +.toolHelp .toolHead #groupLabel { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; +} + +/* productive-heading-03 */ +.toolHelp .toolMain h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +.toolHelp .toolSide .bx--list__item { + color: black; + font-size: 0.875rem; + line-height: 18px; +} + +/* productive-heading-03 */ +.toolHelp .toolSide h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +@media (min-width: 42rem) { + html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; + } +} +body { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + color: var(--cds-text-primary); + background-color: var(--cds-ui-background); +} + +.toolHelp { + padding: 0px; + margin: 0px; + max-width: 100%; + background-color: #e8daff; +} + +.toolHelp p { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; +font-style: normal; +font-weight: 400; +font-size: 14px; +line-height: 20px; +/* or 143% */ + +letter-spacing: 0.16px; +} + +.dds-theme-zone-g90 .toolHelp { + background-color: #31135E; +} + +.toolHelp .bx--row { + margin: 0px; +} + +.toolHelp .toolHead { + margin-bottom: 1rem; + padding-top: 1rem; +} +.toolHelp .toolMain { + background-color: var(--cds-ui-background); + padding-top: 1rem; + padding-bottom: 1rem; + border-top: solid var(--cds-text-primary) 1px; +} +.toolHelp .toolMain h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain p { + margin-top: 0px; +} + +.toolHelp .toolSide { + padding: 16px 16px 16px 32px; + background-color: var(--cds-ui-background); + color: var(--cds-text-primary); + border-top: solid var(--cds-text-primary) 1px; +} +@media (min-width: 42rem) { + .toolHelp .toolSide { + border-left: solid var(--cds-text-primary) 1px; + } +} + +.toolHelp .toolSide h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide p { + margin-top: 0px; +} +@media (min-width: 66rem) { + .toolHelp .toolMain p, bx-list-item { + max-width: 66.66%; + } +} +bx-code-snippet[type="multi"]::after { + height: 0px; +} + +#ruleInfo { + margin-top: 1rem; +} + +#ruleInfo p { + font-size: 14px; +} + +mark-down table tbody tr:hover { + background: var(--cds-layer-hover); +} +mark-down table tbody tr:hover td, mark-down table tbody tr:hover th { + background: var(--cds-layer-hover); + -webkit-border-after: 1px solid var(--cds-layer-hover); + border-block-end: 1px solid var(--cds-layer-hover); + -webkit-border-before: 1px solid var(--cds-layer-hover); + border-block-start: 1px solid var(--cds-layer-hover); + color: var(--cds-text-primary,#161616); +} + +mark-down table { + margin-top: 1rem; + width: 100%; +} + +@media (min-width: 66rem) { + mark-down table { + max-width: 66.66%; + } +} + +mark-down table thead { + font-size: var(--cds-heading-compact-01-font-size,0.875rem); + font-weight: var(--cds-heading-compact-01-font-weight,600); + line-height: var(--cds-heading-compact-01-line-height,1.28572); + letter-spacing: var(--cds-heading-compact-01-letter-spacing,0.16px); + background-color: var(--cds-layer-accent); +} + +mark-down table tr { + border: none; + block-size: 3rem; + inline-size: 100%; +} + +mark-down table th { + background-color: var(--cds-layer-accent); + color: var(--cds-text-primary,#161616); + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; +} + +mark-down table td, mark-down table th { + text-align: start; + vertical-align: middle; +} + +mark-down table tbody { + font-size: var(--cds-body-compact-01-font-size,0.875rem); + font-weight: var(--cds-body-compact-01-font-weight,400); + line-height: var(--cds-body-compact-01-line-height,1.28572); + letter-spacing: var(--cds-body-compact-01-letter-spacing,0.16px); + background-color: var(--cds-layer); + inline-size: 100%; +} + +mark-down table td, mark-down table tbody th { + background: var(--cds-layer); + -webkit-border-after: 1px solid var(--cds-border-subtle); + border-block-end: 1px solid var(--cds-border-subtle); + -webkit-border-before: 1px solid var(--cds-layer); + border-block-start: 1px solid var(--cds-layer); + color: var(--cds-text-secondary,#525252); + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; +} \ No newline at end of file diff --git a/rule-server/src/static/archives/2024.12.12/doc/common/help.js b/rule-server/src/static/archives/2024.12.12/doc/common/help.js new file mode 100644 index 000000000..c8fa2f0ec --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/common/help.js @@ -0,0 +1,225 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ + +class HTMLBaseElement extends HTMLElement { + constructor(...args) { + const self = super(...args); + self.parsed = false; // guard to make it easy to do certain stuff only once + self.parentNodes = []; + return self; + } + + connectedCallback() { + // collect the parentNodes + let el = this; + while (el.parentNode) { + el = el.parentNode; + this.parentNodes.push(el); + } + // check if the parser has already passed the end tag of the component + // in which case this element, or one of its parents, should have a nextSibling + // if not (no whitespace at all between tags and no nextElementSiblings either) + // resort to DOMContentLoaded or load having triggered + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + if (this.childrenAvailableCallback) + this.childrenAvailableCallback(); + this.parsed = true; + } else { + this.mutationObserver = new MutationObserver(() => { + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + if (this.childrenAvailableCallback) + this.childrenAvailableCallback(); + this.parsed = true; + this.mutationObserver.disconnect(); + } + }); + + this.mutationObserver.observe(this, { + childList: true, + }); + } + } +} + +function isDarkMode() { + return (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); +} + +customElements.define( + "mark-down", + class extends HTMLBaseElement { + constructor() { + super(); + setTimeout(() => { + let converted = marked.parse(this.textContent); + this.innerHTML = converted + .replace(/<(\/?)ul>/g, "<$1bx-unordered-list>") + .replace(/<(\/?)li>/g, "<$1bx-list-item>") + .replace(/[ \r\n]*/g, "") + .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + }, 0) + } + // childrenAvailableCallback() { + // let converted = marked.parse(this.innerHTML); + // this.innerHTML = converted + // .replace(/<(\/?)ul>/g, "<$1bx-unordered-list>") + // .replace(/<(\/?)li>/g, "<$1bx-list-item>") + // .replace(/[ \r\n]*/g, "") + // .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + // } + } +); + +customElements.define( + "code-snippet", + class extends HTMLBaseElement { + childrenAvailableCallback() { + let oldCode = this.innerHTML; + this.innerHTML = ""; + // const shadowRoot = this.attachShadow({mode: 'open'}); + const shadowRoot = this; + let snip = document.createElement("bx-code-snippet"); + snip.setAttribute("type", "multi"); + snip.innerHTML = oldCode.replace(/ ruleInfo.msgArgs[matchedNum]); + document.querySelector("#ruleMessage").innerHTML = ruleMessage.replace(/&/g, "&").replace(//g, ">") + } + setTimeout(() => { + if (ruleInfo.snippet) { + let snip = ruleInfo.snippet; + snip = snip.replace(/( [a-zA-Z-]+="[^"]*")/g, "\n $1"); + let snipElem = document.createElement("code-snippet"); + for (let line of snip.split("\n")) { + snipElem.appendChild(document.createTextNode(line+"\n")); + } + let locSnippet = document.querySelector("#locSnippet"); + locSnippet.innerHTML = `

Element location

`; + locSnippet.appendChild(snipElem); + } + }, 0); + if (ruleInfo.value) { + let value = ruleInfo.value; + const val = valueMap[value[0]][value[1]]; + let icon = ""; + if (val === "Violation") icon = ``; + if (val === "Needs review") icon = ``; + if (val === "Recommendation") icon = ``; + let level = document.querySelector("#locLevel"); + let parent = level.parentElement; + level = parent.removeChild(level); + parent.insertBefore(level, parent.firstElementChild); + document.querySelector("#locLevel").innerHTML = `
${val}
`; + } + if (RULE_ID) { + document.querySelector("#ruleInfo").innerHTML = `

Rule ID: ${RULE_ID}${ruleInfo.reasonId ? `
Reason ID: ${ruleInfo.reasonId}

` : ""}`; + } + } +} + +if ("onhashchange" in window) {// does the browser support the hashchange event? + window.onhashchange = function () { + let ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + updateWithRuleInfo(ruleInfo); + } +} + +window.addEventListener("DOMContentLoaded", (evt) => { + let groupMsg = typeof RULE_MESSAGES !== "undefined" && (RULE_MESSAGES["en-US"].group || RULE_MESSAGES["en-US"][0]) || ""; + groupMsg = groupMsg.replace(/&/g, "&").replace(//g, ">"); + document.querySelector("#groupLabel").innerHTML = groupMsg; + let ruleInfo; + if (window.location.search && window.location.search.length > 0) { + const searchParams = new URLSearchParams(window.location.search); + ruleInfo = JSON.parse(decodeURIComponent(searchParams.get("issue"))); + } else if (window.location.hash && window.location.hash.length > 0) { + ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + } + updateWithRuleInfo(ruleInfo); + + if (isDarkMode()) { + document.body.setAttribute("class", "dds-theme-zone-g90"); + } else { + document.body.setAttribute("class", "dds-theme-zone-g10"); + } + +}) + diff --git a/rule-server/src/static/archives/2024.12.12/doc/common/rules.css b/rule-server/src/static/archives/2024.12.12/doc/common/rules.css new file mode 100644 index 000000000..515c8a230 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/common/rules.css @@ -0,0 +1,29 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +@import url('https://unpkg.com/carbon-components/css/carbon-components.min.css'); + +html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; +} + +body { + font-family: 'IBM Plex Sans', sans-serif; + padding: 1rem; +} + +h2 { + margin-top: 1rem; + font-size: 16px; + line-height: 24px; + font-weight: 600; +} diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html new file mode 100644 index 000000000..70d9b1d64 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html @@ -0,0 +1,90 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html new file mode 100644 index 000000000..283bed41c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html @@ -0,0 +1,95 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html new file mode 100644 index 000000000..d5cdca57e --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/a_target_warning.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/a_target_warning.html new file mode 100644 index 000000000..667ca418e --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/a_target_warning.html @@ -0,0 +1,91 @@ + + + + a_target_warning - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/a_text_purpose.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/a_text_purpose.html new file mode 100644 index 000000000..2c7138526 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/a_text_purpose.html @@ -0,0 +1,108 @@ + + + + a_text_purpose - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/applet_alt_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/applet_alt_exists.html new file mode 100644 index 000000000..c8b9a1a00 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/applet_alt_exists.html @@ -0,0 +1,103 @@ + + + + applet_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/application_content_accessible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/application_content_accessible.html new file mode 100644 index 000000000..3eb9eeb14 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/application_content_accessible.html @@ -0,0 +1,97 @@ + + + + application_content_accessible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/area_alt_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/area_alt_exists.html new file mode 100644 index 000000000..fad66e3df --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/area_alt_exists.html @@ -0,0 +1,101 @@ + + + + area_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_accessiblename_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_accessiblename_exists.html new file mode 100644 index 000000000..c4ae82722 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_accessiblename_exists.html @@ -0,0 +1,112 @@ + + + + aria_accessiblename_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_activedescendant_tabindex_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_activedescendant_tabindex_valid.html new file mode 100644 index 000000000..b73e726db --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_activedescendant_tabindex_valid.html @@ -0,0 +1,107 @@ + + + + aria_activedescendant_tabindex_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_activedescendant_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_activedescendant_valid.html new file mode 100644 index 000000000..9a9f0c8b9 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_activedescendant_valid.html @@ -0,0 +1,103 @@ + + + + aria_activedescendant_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_application_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_application_label_unique.html new file mode 100644 index 000000000..74ce77ae0 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_application_label_unique.html @@ -0,0 +1,103 @@ + + + + aria_application_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_application_labelled.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_application_labelled.html new file mode 100644 index 000000000..b45966878 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_application_labelled.html @@ -0,0 +1,100 @@ + + + + aria_application_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_article_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_article_label_unique.html new file mode 100644 index 000000000..9a404e925 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_article_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_article_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_allowed.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_allowed.html new file mode 100644 index 000000000..c144962bc --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_allowed.html @@ -0,0 +1,97 @@ + + + + aria_attribute_allowed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_conflict.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_conflict.html new file mode 100644 index 000000000..4e81729db --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_conflict.html @@ -0,0 +1,109 @@ + + + + aria_attribute_conflict - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_deprecated.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_deprecated.html new file mode 100644 index 000000000..8ff5fa926 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_deprecated.html @@ -0,0 +1,103 @@ + + + + aria_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_exists.html new file mode 100644 index 000000000..6e3d8066d --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_exists.html @@ -0,0 +1,93 @@ + + + + aria_attribute_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_redundant.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_redundant.html new file mode 100644 index 000000000..04b98c64f --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_redundant.html @@ -0,0 +1,98 @@ + + + + aria_attribute_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_required.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_required.html new file mode 100644 index 000000000..a6368c79f --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_required.html @@ -0,0 +1,106 @@ + + + + aria_attribute_required - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_valid.html new file mode 100644 index 000000000..f3aeae30c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_valid.html @@ -0,0 +1,102 @@ + + + + aria_attribute_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_value_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_value_valid.html new file mode 100644 index 000000000..15b357434 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_attribute_value_valid.html @@ -0,0 +1,94 @@ + + + + aria_attribute_value_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_banner_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_banner_label_unique.html new file mode 100644 index 000000000..ca98ec2f1 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_banner_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_banner_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_banner_single.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_banner_single.html new file mode 100644 index 000000000..845247fa0 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_banner_single.html @@ -0,0 +1,98 @@ + + + + aria_banner_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_child_tabbable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_child_tabbable.html new file mode 100644 index 000000000..4a030b145 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_child_tabbable.html @@ -0,0 +1,98 @@ + + + + aria_child_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_child_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_child_valid.html new file mode 100644 index 000000000..8114ac69d --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_child_valid.html @@ -0,0 +1,121 @@ + + + + aria_child_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_label_unique.html new file mode 100644 index 000000000..ca8800820 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_label_unique.html @@ -0,0 +1,103 @@ + + + + aria_complementary_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_label_visible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_label_visible.html new file mode 100644 index 000000000..34b03c6b5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_label_visible.html @@ -0,0 +1,100 @@ + + + + aria_complementary_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_labelled.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_labelled.html new file mode 100644 index 000000000..2dd634c90 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_complementary_labelled.html @@ -0,0 +1,100 @@ + + + + aria_complementary_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_content_in_landmark.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_content_in_landmark.html new file mode 100644 index 000000000..35c206de4 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_content_in_landmark.html @@ -0,0 +1,92 @@ + + + + aria_content_in_landmark - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_label_unique.html new file mode 100644 index 000000000..2b5641797 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_contentinfo_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_misuse.html new file mode 100644 index 000000000..740efe106 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_misuse.html @@ -0,0 +1,105 @@ + + + + aria_contentinfo_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_single.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_single.html new file mode 100644 index 000000000..861de7861 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_contentinfo_single.html @@ -0,0 +1,100 @@ + + + + aria_contentinfo_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_descendant_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_descendant_valid.html new file mode 100644 index 000000000..e2154211c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_descendant_valid.html @@ -0,0 +1,101 @@ + + + + aria_descendant_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_document_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_document_label_unique.html new file mode 100644 index 000000000..9224ea9fc --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_document_label_unique.html @@ -0,0 +1,91 @@ + + + + aria_document_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_eventhandler_role_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_eventhandler_role_valid.html new file mode 100644 index 000000000..acdfcea1a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_eventhandler_role_valid.html @@ -0,0 +1,92 @@ + + + + aria_eventhandler_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_form_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_form_label_unique.html new file mode 100644 index 000000000..ec58b65a1 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_form_label_unique.html @@ -0,0 +1,112 @@ + + + + aria_form_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_graphic_labelled.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_graphic_labelled.html new file mode 100644 index 000000000..d3d9b2125 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_graphic_labelled.html @@ -0,0 +1,99 @@ + + + + aria_graphic_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_hidden_nontabbable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_hidden_nontabbable.html new file mode 100644 index 000000000..d7c54e671 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_hidden_nontabbable.html @@ -0,0 +1,113 @@ + + + + aria_hidden_nontabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_id_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_id_unique.html new file mode 100644 index 000000000..b0bc3040c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_id_unique.html @@ -0,0 +1,98 @@ + + + + aria_id_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_img_labelled.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_img_labelled.html new file mode 100644 index 000000000..7dff4a079 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_img_labelled.html @@ -0,0 +1,100 @@ + + + + aria_img_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_keyboard_handler_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_keyboard_handler_exists.html new file mode 100644 index 000000000..6c840d10e --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_keyboard_handler_exists.html @@ -0,0 +1,103 @@ + + + + aria_keyboard_handler_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_landmark_name_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_landmark_name_unique.html new file mode 100644 index 000000000..556c2d184 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_landmark_name_unique.html @@ -0,0 +1,110 @@ + + + + aria_landmark_name_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_main_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_main_label_unique.html new file mode 100644 index 000000000..f063a76c8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_main_label_unique.html @@ -0,0 +1,111 @@ + + + + aria_main_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_main_label_visible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_main_label_visible.html new file mode 100644 index 000000000..bcdaf8ae9 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_main_label_visible.html @@ -0,0 +1,102 @@ + + + + aria_main_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_navigation_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_navigation_label_unique.html new file mode 100644 index 000000000..ff7c4baa9 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_navigation_label_unique.html @@ -0,0 +1,106 @@ + + + + aria_navigation_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_parent_required.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_parent_required.html new file mode 100644 index 000000000..155570233 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_parent_required.html @@ -0,0 +1,98 @@ + + + + aria_parent_required - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_region_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_region_label_unique.html new file mode 100644 index 000000000..55466d5ef --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_region_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_region_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_region_labelled.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_region_labelled.html new file mode 100644 index 000000000..2280d407a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_region_labelled.html @@ -0,0 +1,102 @@ + + + + aria_region_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_allowed.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_allowed.html new file mode 100644 index 000000000..439e94700 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_allowed.html @@ -0,0 +1,105 @@ + + + + aria_role_allowed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_redundant.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_redundant.html new file mode 100644 index 000000000..ab0dc4c50 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_redundant.html @@ -0,0 +1,107 @@ + + + + aria_role_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_valid.html new file mode 100644 index 000000000..896311194 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_role_valid.html @@ -0,0 +1,90 @@ + + + + aria_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_search_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_search_label_unique.html new file mode 100644 index 000000000..cea329abb --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_search_label_unique.html @@ -0,0 +1,100 @@ + + + + aria_search_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_toolbar_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_toolbar_label_unique.html new file mode 100644 index 000000000..4b1b4db28 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_toolbar_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_toolbar_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_widget_labelled.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_widget_labelled.html new file mode 100644 index 000000000..52460feb5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/aria_widget_labelled.html @@ -0,0 +1,102 @@ + + + + aria_widget_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/asciiart_alt_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/asciiart_alt_exists.html new file mode 100644 index 000000000..06a60bfa8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/asciiart_alt_exists.html @@ -0,0 +1,91 @@ + + + + asciiart_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/blink_css_review.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/blink_css_review.html new file mode 100644 index 000000000..801a20fca --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/blink_css_review.html @@ -0,0 +1,94 @@ + + + + blink_css_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/blink_elem_deprecated.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/blink_elem_deprecated.html new file mode 100644 index 000000000..5f4b14dd0 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/blink_elem_deprecated.html @@ -0,0 +1,94 @@ + + + + blink_elem_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/blockquote_cite_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/blockquote_cite_exists.html new file mode 100644 index 000000000..0899d3948 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/blockquote_cite_exists.html @@ -0,0 +1,91 @@ + + + + blockquote_cite_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/canvas_content_described.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/canvas_content_described.html new file mode 100644 index 000000000..1f305d6e2 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/canvas_content_described.html @@ -0,0 +1,115 @@ + + + + canvas_content_described - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/caption_track_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/caption_track_exists.html new file mode 100644 index 000000000..45bdbbe4d --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/caption_track_exists.html @@ -0,0 +1,100 @@ + + + + caption_track_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_active_descendant.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_active_descendant.html new file mode 100644 index 000000000..d4d30b1bd --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_active_descendant.html @@ -0,0 +1,109 @@ + + + + combobox_active_descendant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_autocomplete_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_autocomplete_valid.html new file mode 100644 index 000000000..0eeed4998 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_autocomplete_valid.html @@ -0,0 +1,136 @@ + + + + combobox_autocomplete_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_design_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_design_valid.html new file mode 100644 index 000000000..b9d827b06 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_design_valid.html @@ -0,0 +1,93 @@ + + + + combobox_design_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_focusable_elements.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_focusable_elements.html new file mode 100644 index 000000000..553320b99 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_focusable_elements.html @@ -0,0 +1,92 @@ + + + + combobox_focusable_elements - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_haspopup_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_haspopup_valid.html new file mode 100644 index 000000000..5069d1662 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_haspopup_valid.html @@ -0,0 +1,107 @@ + + + + combobox_haspopup_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_popup_reference.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_popup_reference.html new file mode 100644 index 000000000..d166b30a5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/combobox_popup_reference.html @@ -0,0 +1,109 @@ + + + + combobox_popup_reference - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/dir_attribute_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/dir_attribute_valid.html new file mode 100644 index 000000000..443618ffc --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/dir_attribute_valid.html @@ -0,0 +1,89 @@ + + + + dir_attribute_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/download_keyboard_controllable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/download_keyboard_controllable.html new file mode 100644 index 000000000..7a2517fa1 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/download_keyboard_controllable.html @@ -0,0 +1,92 @@ + + + + download_keyboard_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/draggable_alternative_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/draggable_alternative_exists.html new file mode 100644 index 000000000..6a5fc677b --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/draggable_alternative_exists.html @@ -0,0 +1,105 @@ + + + + draggable_alternative_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_accesskey_labelled.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_accesskey_labelled.html new file mode 100644 index 000000000..7cbc57d89 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_accesskey_labelled.html @@ -0,0 +1,97 @@ + + + + element_accesskey_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_accesskey_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_accesskey_unique.html new file mode 100644 index 000000000..2818e7745 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_accesskey_unique.html @@ -0,0 +1,100 @@ + + + + element_accesskey_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_attribute_deprecated.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_attribute_deprecated.html new file mode 100644 index 000000000..0136c1d56 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_attribute_deprecated.html @@ -0,0 +1,103 @@ + + + + element_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_id_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_id_unique.html new file mode 100644 index 000000000..17580119f --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_id_unique.html @@ -0,0 +1,102 @@ + + + + element_id_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_lang_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_lang_valid.html new file mode 100644 index 000000000..bca07c8d9 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_lang_valid.html @@ -0,0 +1,108 @@ + + + + element_lang_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_mouseevent_keyboard.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_mouseevent_keyboard.html new file mode 100644 index 000000000..4b0fda7a8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_mouseevent_keyboard.html @@ -0,0 +1,102 @@ + + + + element_mouseevent_keyboard - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_orientation_unlocked.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_orientation_unlocked.html new file mode 100644 index 000000000..d637b6c4c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_orientation_unlocked.html @@ -0,0 +1,112 @@ + + + + element_orientation_unlocked - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_scrollable_tabbable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_scrollable_tabbable.html new file mode 100644 index 000000000..cf1c4069c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_scrollable_tabbable.html @@ -0,0 +1,115 @@ + + + + element_scrollable_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_role_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_role_valid.html new file mode 100644 index 000000000..c8f22088c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_role_valid.html @@ -0,0 +1,136 @@ + + + + element_tabbable_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_unobscured.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_unobscured.html new file mode 100644 index 000000000..1980fcbef --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_unobscured.html @@ -0,0 +1,103 @@ + + + + element_tabbable_unobscured - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_visible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_visible.html new file mode 100644 index 000000000..e7a684f2f --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/element_tabbable_visible.html @@ -0,0 +1,124 @@ + + + + element_tabbable_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/embed_alt_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/embed_alt_exists.html new file mode 100644 index 000000000..f6e037df5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/embed_alt_exists.html @@ -0,0 +1,95 @@ + + + + embed_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/embed_noembed_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/embed_noembed_exists.html new file mode 100644 index 000000000..a0aca36d8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/embed_noembed_exists.html @@ -0,0 +1,102 @@ + + + + embed_noembed_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/emoticons_alt_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/emoticons_alt_exists.html new file mode 100644 index 000000000..2d06c83b0 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/emoticons_alt_exists.html @@ -0,0 +1,91 @@ + + + + emoticons_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/error_message_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/error_message_exists.html new file mode 100644 index 000000000..1e1f3d5a2 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/error_message_exists.html @@ -0,0 +1,105 @@ + + + + error_message_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/fieldset_label_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/fieldset_label_valid.html new file mode 100644 index 000000000..50b49155c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/fieldset_label_valid.html @@ -0,0 +1,106 @@ + + + + fieldset_label_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/fieldset_legend_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/fieldset_legend_valid.html new file mode 100644 index 000000000..c68280bbb --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/fieldset_legend_valid.html @@ -0,0 +1,101 @@ + + + + fieldset_legend_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/figure_label_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/figure_label_exists.html new file mode 100644 index 000000000..35aceb565 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/figure_label_exists.html @@ -0,0 +1,104 @@ + + + + figure_label_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/form_font_color.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_font_color.html new file mode 100644 index 000000000..2818da309 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_font_color.html @@ -0,0 +1,90 @@ + + + + form_font_color - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/form_interaction_review.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_interaction_review.html new file mode 100644 index 000000000..30abfe2d6 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_interaction_review.html @@ -0,0 +1,92 @@ + + + + form_interaction_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/form_label_unique.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_label_unique.html new file mode 100644 index 000000000..d1b74b905 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_label_unique.html @@ -0,0 +1,90 @@ + + + + form_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/form_submit_button_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_submit_button_exists.html new file mode 100644 index 000000000..509b44144 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_submit_button_exists.html @@ -0,0 +1,92 @@ + + + + form_submit_button_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/form_submit_review.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_submit_review.html new file mode 100644 index 000000000..6129ae2af --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/form_submit_review.html @@ -0,0 +1,93 @@ + + + + form_submit_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/frame_src_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/frame_src_valid.html new file mode 100644 index 000000000..bea8d0a99 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/frame_src_valid.html @@ -0,0 +1,95 @@ + + + + frame_src_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/frame_title_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/frame_title_exists.html new file mode 100644 index 000000000..5e0e81cbc --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/frame_title_exists.html @@ -0,0 +1,99 @@ + + + + frame_title_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/heading_content_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/heading_content_exists.html new file mode 100644 index 000000000..953e2d3d5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/heading_content_exists.html @@ -0,0 +1,89 @@ + + + + heading_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/heading_markup_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/heading_markup_misuse.html new file mode 100644 index 000000000..1fa519ba4 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/heading_markup_misuse.html @@ -0,0 +1,92 @@ + + + + heading_markup_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/html_lang_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/html_lang_exists.html new file mode 100644 index 000000000..d66c20426 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/html_lang_exists.html @@ -0,0 +1,92 @@ + + + + html_lang_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/html_lang_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/html_lang_valid.html new file mode 100644 index 000000000..1d90f0a2a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/html_lang_valid.html @@ -0,0 +1,111 @@ + + + + html_lang_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/html_skipnav_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/html_skipnav_exists.html new file mode 100644 index 000000000..97c0fbe6c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/html_skipnav_exists.html @@ -0,0 +1,91 @@ + + + + html_skipnav_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/iframe_interactive_tabbable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/iframe_interactive_tabbable.html new file mode 100644 index 000000000..88576fd71 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/iframe_interactive_tabbable.html @@ -0,0 +1,105 @@ + + + + iframe_interactive_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/imagebutton_alt_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/imagebutton_alt_exists.html new file mode 100644 index 000000000..6f3354129 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/imagebutton_alt_exists.html @@ -0,0 +1,90 @@ + + + + imagebutton_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/imagemap_alt_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/imagemap_alt_exists.html new file mode 100644 index 000000000..2327fe32b --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/imagemap_alt_exists.html @@ -0,0 +1,101 @@ + + + + imagemap_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_background.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_background.html new file mode 100644 index 000000000..501d5a5c6 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_background.html @@ -0,0 +1,90 @@ + + + + img_alt_background - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_decorative.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_decorative.html new file mode 100644 index 000000000..3f47082d2 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_decorative.html @@ -0,0 +1,93 @@ + + + + img_alt_decorative - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_misuse.html new file mode 100644 index 000000000..a15718c7d --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_misuse.html @@ -0,0 +1,91 @@ + + + + img_alt_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_null.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_null.html new file mode 100644 index 000000000..6baf41d73 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_null.html @@ -0,0 +1,94 @@ + + + + img_alt_null - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_redundant.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_redundant.html new file mode 100644 index 000000000..e4adefc89 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_redundant.html @@ -0,0 +1,94 @@ + + + + img_alt_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_valid.html new file mode 100644 index 000000000..81d8347a7 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_alt_valid.html @@ -0,0 +1,99 @@ + + + + img_alt_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/img_ismap_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_ismap_misuse.html new file mode 100644 index 000000000..6ca9f2ca8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_ismap_misuse.html @@ -0,0 +1,91 @@ + + + + img_ismap_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/img_longdesc_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_longdesc_misuse.html new file mode 100644 index 000000000..62d46371a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/img_longdesc_misuse.html @@ -0,0 +1,98 @@ + + + + img_longdesc_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_autocomplete_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_autocomplete_valid.html new file mode 100644 index 000000000..07419cfb9 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_autocomplete_valid.html @@ -0,0 +1,121 @@ + + + + input_autocomplete_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_checkboxes_grouped.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_checkboxes_grouped.html new file mode 100644 index 000000000..f538de4eb --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_checkboxes_grouped.html @@ -0,0 +1,90 @@ + + + + input_checkboxes_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_fields_grouped.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_fields_grouped.html new file mode 100644 index 000000000..cdd42e7c8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_fields_grouped.html @@ -0,0 +1,104 @@ + + + + input_fields_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_haspopup_conflict.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_haspopup_conflict.html new file mode 100644 index 000000000..c3f35b332 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_haspopup_conflict.html @@ -0,0 +1,120 @@ + + + + input_haspopup_conflict - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_after.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_after.html new file mode 100644 index 000000000..7aeaa1caf --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_after.html @@ -0,0 +1,98 @@ + + + + input_label_after - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_before.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_before.html new file mode 100644 index 000000000..f1e8b9ad7 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_before.html @@ -0,0 +1,99 @@ + + + + input_label_before - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_exists.html new file mode 100644 index 000000000..42ee41906 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_exists.html @@ -0,0 +1,94 @@ + + + + input_label_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_visible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_visible.html new file mode 100644 index 000000000..db950076a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_label_visible.html @@ -0,0 +1,127 @@ + + + + input_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_onchange_review.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_onchange_review.html new file mode 100644 index 000000000..1766464b8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_onchange_review.html @@ -0,0 +1,103 @@ + + + + input_onchange_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/input_placeholder_label_visible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_placeholder_label_visible.html new file mode 100644 index 000000000..a7d082dfc --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/input_placeholder_label_visible.html @@ -0,0 +1,107 @@ + + + + input_placeholder_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/label_content_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/label_content_exists.html new file mode 100644 index 000000000..83638a423 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/label_content_exists.html @@ -0,0 +1,90 @@ + + + + label_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/label_name_visible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/label_name_visible.html new file mode 100644 index 000000000..687551cb0 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/label_name_visible.html @@ -0,0 +1,97 @@ + + + + label_name_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/label_ref_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/label_ref_valid.html new file mode 100644 index 000000000..185c0828c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/label_ref_valid.html @@ -0,0 +1,97 @@ + + + + label_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/list_children_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/list_children_valid.html new file mode 100644 index 000000000..2b7416267 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/list_children_valid.html @@ -0,0 +1,111 @@ + + + + list_children_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/list_markup_review.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/list_markup_review.html new file mode 100644 index 000000000..0bdc45328 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/list_markup_review.html @@ -0,0 +1,91 @@ + + + + list_markup_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/list_structure_proper.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/list_structure_proper.html new file mode 100644 index 000000000..51825a449 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/list_structure_proper.html @@ -0,0 +1,89 @@ + + + + list_structure_proper - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/marquee_elem_avoid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/marquee_elem_avoid.html new file mode 100644 index 000000000..081a6ccc8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/marquee_elem_avoid.html @@ -0,0 +1,94 @@ + + + + marquee_elem_avoid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/media_alt_brief.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_alt_brief.html new file mode 100644 index 000000000..efd7ae0f5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_alt_brief.html @@ -0,0 +1,111 @@ + + + + media_alt_brief - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/media_alt_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_alt_exists.html new file mode 100644 index 000000000..71396386d --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_alt_exists.html @@ -0,0 +1,95 @@ + + + + media_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/media_audio_transcribed.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_audio_transcribed.html new file mode 100644 index 000000000..01605fb11 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_audio_transcribed.html @@ -0,0 +1,97 @@ + + + + media_audio_transcribed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/media_autostart_controllable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_autostart_controllable.html new file mode 100644 index 000000000..43c34071a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_autostart_controllable.html @@ -0,0 +1,93 @@ + + + + media_autostart_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/media_keyboard_controllable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_keyboard_controllable.html new file mode 100644 index 000000000..d5ec73e48 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_keyboard_controllable.html @@ -0,0 +1,111 @@ + + + + media_keyboard_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/media_live_captioned.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_live_captioned.html new file mode 100644 index 000000000..bdb7e5f15 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_live_captioned.html @@ -0,0 +1,91 @@ + + + + media_live_captioned - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/media_track_available.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_track_available.html new file mode 100644 index 000000000..291e71a41 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/media_track_available.html @@ -0,0 +1,96 @@ + + + + media_track_available - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_redirect_optional.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_redirect_optional.html new file mode 100644 index 000000000..1aae651c5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_redirect_optional.html @@ -0,0 +1,94 @@ + + + + meta_redirect_optional - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_refresh_delay.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_refresh_delay.html new file mode 100644 index 000000000..14c3db809 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_refresh_delay.html @@ -0,0 +1,95 @@ + + + + meta_refresh_delay - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_viewport_zoomable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_viewport_zoomable.html new file mode 100644 index 000000000..665826d05 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/meta_viewport_zoomable.html @@ -0,0 +1,98 @@ + + + + meta_viewport_zoomable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/noembed_content_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/noembed_content_exists.html new file mode 100644 index 000000000..c732e33d1 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/noembed_content_exists.html @@ -0,0 +1,100 @@ + + + + noembed_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/object_text_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/object_text_exists.html new file mode 100644 index 000000000..1e3b2571c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/object_text_exists.html @@ -0,0 +1,101 @@ + + + + object_text_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/page_title_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/page_title_exists.html new file mode 100644 index 000000000..2e97f758f --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/page_title_exists.html @@ -0,0 +1,103 @@ + + + + page_title_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/page_title_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/page_title_valid.html new file mode 100644 index 000000000..e53fe87d5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/page_title_valid.html @@ -0,0 +1,105 @@ + + + + page_title_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/script_focus_blur_review.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/script_focus_blur_review.html new file mode 100644 index 000000000..88f135481 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/script_focus_blur_review.html @@ -0,0 +1,96 @@ + + + + script_focus_blur_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/script_onclick_avoid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/script_onclick_avoid.html new file mode 100644 index 000000000..07132ad72 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/script_onclick_avoid.html @@ -0,0 +1,92 @@ + + + + script_onclick_avoid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/script_onclick_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/script_onclick_misuse.html new file mode 100644 index 000000000..e211e9d26 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/script_onclick_misuse.html @@ -0,0 +1,92 @@ + + + + script_onclick_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/script_select_review.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/script_select_review.html new file mode 100644 index 000000000..f4ce0fdec --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/script_select_review.html @@ -0,0 +1,97 @@ + + + + script_select_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/select_options_grouped.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/select_options_grouped.html new file mode 100644 index 000000000..255896592 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/select_options_grouped.html @@ -0,0 +1,90 @@ + + + + select_options_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/skip_main_described.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/skip_main_described.html new file mode 100644 index 000000000..a3674a81b --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/skip_main_described.html @@ -0,0 +1,100 @@ + + + + skip_main_described - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/skip_main_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/skip_main_exists.html new file mode 100644 index 000000000..aeff0fcd6 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/skip_main_exists.html @@ -0,0 +1,103 @@ + + + + skip_main_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/style_background_decorative.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_background_decorative.html new file mode 100644 index 000000000..6cf43d2e7 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_background_decorative.html @@ -0,0 +1,93 @@ + + + + style_background_decorative - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/style_before_after_review.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_before_after_review.html new file mode 100644 index 000000000..e83a2b1c0 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_before_after_review.html @@ -0,0 +1,95 @@ + + + + style_before_after_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/style_color_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_color_misuse.html new file mode 100644 index 000000000..e7906bfb2 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_color_misuse.html @@ -0,0 +1,89 @@ + + + + style_color_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/style_focus_visible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_focus_visible.html new file mode 100644 index 000000000..fdc7d90e0 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_focus_visible.html @@ -0,0 +1,97 @@ + + + + style_focus_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/style_highcontrast_visible.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_highcontrast_visible.html new file mode 100644 index 000000000..75e0e8a02 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_highcontrast_visible.html @@ -0,0 +1,100 @@ + + + + style_highcontrast_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/style_hover_persistent.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_hover_persistent.html new file mode 100644 index 000000000..242babd24 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_hover_persistent.html @@ -0,0 +1,118 @@ + + + + style_hover_persistent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/style_viewport_resizable.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_viewport_resizable.html new file mode 100644 index 000000000..b8daa7d29 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/style_viewport_resizable.html @@ -0,0 +1,93 @@ + + + + style_viewport_resizable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/svg_graphics_labelled.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/svg_graphics_labelled.html new file mode 100644 index 000000000..c5be3bc6f --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/svg_graphics_labelled.html @@ -0,0 +1,127 @@ + + + + svg_graphics_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_aria_descendants.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_aria_descendants.html new file mode 100644 index 000000000..4ec41910b --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_aria_descendants.html @@ -0,0 +1,110 @@ + + + + table_aria_descendants - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_caption_empty.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_caption_empty.html new file mode 100644 index 000000000..aa31cbc13 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_caption_empty.html @@ -0,0 +1,101 @@ + + + + table_caption_empty - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_caption_nested.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_caption_nested.html new file mode 100644 index 000000000..c52a43310 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_caption_nested.html @@ -0,0 +1,98 @@ + + + + table_caption_nested - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_exists.html new file mode 100644 index 000000000..fe05efe22 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_exists.html @@ -0,0 +1,93 @@ + + + + table_headers_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_ref_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_ref_valid.html new file mode 100644 index 000000000..15d66ea3d --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_ref_valid.html @@ -0,0 +1,91 @@ + + + + table_headers_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_related.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_related.html new file mode 100644 index 000000000..addc41858 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_headers_related.html @@ -0,0 +1,91 @@ + + + + table_headers_related - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_layout_linearized.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_layout_linearized.html new file mode 100644 index 000000000..2e9a26134 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_layout_linearized.html @@ -0,0 +1,92 @@ + + + + table_layout_linearized - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_scope_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_scope_valid.html new file mode 100644 index 000000000..0632f7a4a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_scope_valid.html @@ -0,0 +1,93 @@ + + + + table_scope_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_structure_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_structure_misuse.html new file mode 100644 index 000000000..2fe51c995 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_structure_misuse.html @@ -0,0 +1,91 @@ + + + + table_structure_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/table_summary_redundant.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_summary_redundant.html new file mode 100644 index 000000000..130448ab8 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/table_summary_redundant.html @@ -0,0 +1,101 @@ + + + + table_summary_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/target_spacing_sufficient.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/target_spacing_sufficient.html new file mode 100644 index 000000000..a18167c6a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/target_spacing_sufficient.html @@ -0,0 +1,108 @@ + + + + target_spacing_sufficient - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/text_block_heading.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_block_heading.html new file mode 100644 index 000000000..1621a401d --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_block_heading.html @@ -0,0 +1,92 @@ + + + + text_block_heading - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/text_contrast_sufficient.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_contrast_sufficient.html new file mode 100644 index 000000000..6a1f68348 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_contrast_sufficient.html @@ -0,0 +1,92 @@ + + + + text_contrast_sufficient - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/text_quoted_correctly.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_quoted_correctly.html new file mode 100644 index 000000000..8daea810e --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_quoted_correctly.html @@ -0,0 +1,106 @@ + + + + text_quoted_correctly - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/text_sensory_misuse.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_sensory_misuse.html new file mode 100644 index 000000000..6caf0e252 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_sensory_misuse.html @@ -0,0 +1,96 @@ + + + + text_sensory_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/text_spacing_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_spacing_valid.html new file mode 100644 index 000000000..5b7b8fc45 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_spacing_valid.html @@ -0,0 +1,103 @@ + + + + text_spacing_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/text_whitespace_valid.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_whitespace_valid.html new file mode 100644 index 000000000..befb5cc2c --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/text_whitespace_valid.html @@ -0,0 +1,93 @@ + + + + text_whitespace_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/widget_tabbable_exists.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/widget_tabbable_exists.html new file mode 100644 index 000000000..442e7f0ce --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/widget_tabbable_exists.html @@ -0,0 +1,98 @@ + + + + widget_tabbable_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/en-US/widget_tabbable_single.html b/rule-server/src/static/archives/2024.12.12/doc/en-US/widget_tabbable_single.html new file mode 100644 index 000000000..002ba6652 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/en-US/widget_tabbable_single.html @@ -0,0 +1,96 @@ + + + + widget_tabbable_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2024.12.12/doc/rules.csv b/rule-server/src/static/archives/2024.12.12/doc/rules.csv new file mode 100644 index 000000000..d4998642b --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/rules.csv @@ -0,0 +1,444 @@ +Rule ID, Reason Code, Rule message, Reason message, Violation Level, Toolkit Level, WCAG Requirements, ACT mapping +"applet_alt_exists","Pass_0"," elements must provide an 'alt' attribute and an alternative description","Rule Passed","Pass","1","1.1.1","" +"applet_alt_exists","Fail_1"," elements must provide an 'alt' attribute and an alternative description","An element does not have an 'alt' attribute that provides a short text alternative","Violation","1","1.1.1","" +"applet_alt_exists","Fail_2"," elements must provide an 'alt' attribute and an alternative description","The 'alt' attribute value for an element duplicates the 'code' attribute","Violation","1","1.1.1","" +"applet_alt_exists","Fail_3"," elements must provide an 'alt' attribute and an alternative description","An element provides alternative text, but does not provide inner content","Violation","1","1.1.1","" +"img_alt_redundant","Pass_0","The text alternative for an image within a link should not repeat the link text or adjacent link text","Rule Passed","Pass","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_1","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text is repeated in an image 'alt' value within the same link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_2","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text of previous link is repeated in image 'alt' value of a link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_3","The text alternative for an image within a link should not repeat the link text or adjacent link text","Image 'alt' value within a link is repeated in link text of the link after","Violation","2","1.1.1,2.4.4","" +"img_alt_valid","pass","Images must have accessible names unless they are decorative or redundant","The image has an accessible name or is correctly marked as decorative or redundant","Pass","1","1.1.1","23a2a8:pass" +"img_alt_valid","fail_blank_alt","Images must have accessible names unless they are decorative or redundant","Image 'alt' attribute value consists only of blank space(s)","Violation","1","1.1.1","23a2a8:fail" +"img_alt_valid","fail_no_alt","Images must have accessible names unless they are decorative or redundant","The image has neither an accessible name nor is marked as decorative or redundant","Violation","1","1.1.1","23a2a8:fail" +"img_alt_valid","fail_blank_title","Images must have accessible names unless they are decorative or redundant","The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)","Violation","1","1.1.1","23a2a8:fail" +"imagebutton_alt_exists","Pass_0","The element of type ""image"" should have a text alternative","Image button provides alternative text using the 'alt' attribute","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Pass_1","The element of type ""image"" should have a text alternative","Image button provides alternative text using an ARIA label","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Pass_2","The element of type ""image"" should have a text alternative","Image button provides alternative text using the 'title' attribute","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Fail","The element of type ""image"" should have a text alternative","The element of type ""image"" has no text alternative","Violation","1","1.1.1","59796f:fail" +"area_alt_exists","Pass_0"," elements in an image map must have a text alternative","Rule Passed","Pass","1","1.1.1","" +"area_alt_exists","Fail_1"," elements in an image map must have a text alternative"," element in an image map has no text alternative","Violation","1","1.1.1","" +"imagemap_alt_exists","Pass_0","An image map and each element in an image map must have text alternative(s)","Rule Passed","Pass","1","1.1.1","" +"imagemap_alt_exists","Fail_1","An image map and each element in an image map must have text alternative(s)","Image map or child has no text alternative","Violation","1","1.1.1","" +"img_alt_decorative","Pass_0","Image designated as decorative must have 'alt=""""","Rule Passed","Pass","1","1.1.1","" +"img_alt_decorative","Fail_1","Image designated as decorative must have 'alt=""""","Image designated as decorative has non-null 'alt' attribute","Violation","1","1.1.1","" +"object_text_exists","pass"," element must have a text alternative for the content rendered by the object"," element has a text alternative","Pass","1","1.1.1","8fc3b6:pass" +"object_text_exists","fail_no_text_alternative"," element must have a text alternative for the content rendered by the object","An element does not have a text alternative","Violation","1","1.1.1","8fc3b6:fail" +"svg_graphics_labelled","pass","A non-decorative SVG element must have an accessible name","The SVG element has an accessible name","Pass","1","1.1.1","7d6734:pass" +"svg_graphics_labelled","fail_acc_name","A non-decorative SVG element must have an accessible name","The SVG element has no accessible name","Violation","1","1.1.1","7d6734:fail" +"img_alt_null","fail_decorative","When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used","The image 'alt' attribute is empty, but the 'title' attribute is not empty","Violation | Violation","1 | 1","1.1.1 | ARIA","" +"application_content_accessible","Pass_0","Non-decorative static text and image content within an element with ""application"" role must be accessible","Rule Passed","Pass","1","1.1.1,2.1.1","" +"application_content_accessible","Potential_1","Non-decorative static text and image content within an element with ""application"" role must be accessible","Verify that the non-decorative static text and image content within an element with ""application"" role are accessible","Violation Potential","1","1.1.1,2.1.1","" +"img_alt_misuse","Pass_0","'alt' attribute value must be a good inline replacement for the image","Rule Passed","Pass","1","1.1.1","" +"img_alt_misuse","Potential_1","'alt' attribute value must be a good inline replacement for the image","Verify that the file name serves as a good inline replacement for the image","Violation Potential","1","1.1.1","" +"img_ismap_misuse","Pass_0","Server-side image map hot-spots must have duplicate text links","Rule Passed","Pass","2","1.1.1","" +"img_ismap_misuse","Potential_1","Server-side image map hot-spots must have duplicate text links","Server-side image map hot-spots do not have duplicate text links","Violation Potential","2","1.1.1","" +"img_longdesc_misuse","Pass_0"," The 'longdesc' attribute must reference HTML content","Rule Passed","Pass","1","1.1.1","" +"img_longdesc_misuse","Potential_1"," The 'longdesc' attribute must reference HTML content","Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)","Violation Potential","1","1.1.1","" +"media_alt_exists","Pass_0","Audio or video on the page must have a short text alternative that describes the media content","Rule Passed","Pass","2","1.1.1","" +"media_alt_exists","Potential_1","Audio or video on the page must have a short text alternative that describes the media content","Filename used as label for embedded audio or video","Violation Potential","2","1.1.1","" +"style_background_decorative","Pass_0","Images included by using CSS alone must not convey important information","Rule Passed","Pass","1","1.1.1","" +"style_background_decorative","Potential_1","Images included by using CSS alone must not convey important information","Verify the CSS background image does not convey important information","Violation Potential","1","1.1.1","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"figure_label_exists","Pass_0","A
element must have an associated label","Rule Passed","Pass","3","1.1.1","" +"figure_label_exists","Fail_1","A
element must have an associated label","The
element does not have an associated label","Rec","3","1.1.1","" +"embed_alt_exists","Pass_0","Provide alternative content for elements","Rule Passed","Pass","4","1.1.1","" +"embed_alt_exists","Potential_1","Provide alternative content for elements","Verify that the element has alternative content","Rec Potential","4","1.1.1","" +"embed_noembed_exists","Pass_0"," elements should be immediately followed by a non-embedded element","Rule Passed","Pass","4","1.1.1","" +"embed_noembed_exists","Potential_1"," elements should be immediately followed by a non-embedded element","Verify that the element is immediately followed by a non-embedded element","Rec Potential","4","1.1.1","" +"media_alt_brief","Pass_0","Alternative text in 'alt' attribute should be brief (<150 characters)","Rule Passed","Pass","2","1.1.1","" +"media_alt_brief","Potential_1","Alternative text in 'alt' attribute should be brief (<150 characters)","Text alternative is more than 150 characters","Rec Potential","2","1.1.1","" +"noembed_content_exists","Pass_0"," elements should contain descriptive text","Rule Passed","Pass","4","1.1.1","" +"noembed_content_exists","Potential_1","<noembed> elements should contain descriptive text","Add descriptive text to the <noembed> element","Rec Potential","4","1.1.1","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"img_alt_background","Pass_0","Background images that convey important information must have a text alternative that describes the image","Rule Passed","Pass","2","1.1.1","" +"img_alt_background","Manual_1","Background images that convey important information must have a text alternative that describes the image","Verify important background image information has a text alternative in system high contrast mode","Rec Manual","2","1.1.1","" +"media_audio_transcribed","Manual_1","Audio information should also be available in text form","Provide transcripts for audio files","Rec Manual","3","1.2.1","" +"caption_track_exists","Pass_0","A <video> element must have a text alternative for any meaningful audio content","Rule Passed","Pass","1","1.2.2","" +"caption_track_exists","Potential_1","A <video> element must have a text alternative for any meaningful audio content","Verify that captions are available for any meaningful audio or provide a caption track for the <video> element","Violation Potential","1","1.2.2","" +"media_track_available","Manual_1","Pre-recorded media should have an audio track that describes visual information","Verify availability of a user-selectable audio track with description of visual content","Rec Manual","3","1.2.3,1.2.5","" +"media_live_captioned","Manual_1","Live media (streaming video with audio) should have captions for audio content","Verify captions are provided for live media (streaming video with audio)","Rec Manual","1","1.2.4","" +"media_track_available","Manual_1","Pre-recorded media should have an audio track that describes visual information","Verify availability of a user-selectable audio track with description of visual content","Rec Manual","3","1.2.3,1.2.5","" +"input_checkboxes_grouped","pass_lonenogroup","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} grouping not required for a control of this type","Pass","2","1.3.1","" +"input_checkboxes_grouped","pass_grouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is grouped with other related controls with the same name","Pass","2","1.3.1","" +"input_checkboxes_grouped","pass_radiononame","Related sets of radio buttons or checkboxes should be programmatically grouped","Radio input is not grouped, but passes because it has no name to group with other radio inputs","Pass","2","1.3.1","" +"input_checkboxes_grouped","fail_controlnamemismatch","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input found that has the same name, ""{2}"" as a {1} input","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notgroupedothergrouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is not in the group with another {0} with the name ""{1}""","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notgroupedothernotgrouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input and others with the name ""{1}"" are not grouped together","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notsamegroup","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is in a different group than another {0} with the name ""{1}""","Violation","2","1.3.1","" +"input_checkboxes_grouped","potential_lonecheckbox","Related sets of radio buttons or checkboxes should be programmatically grouped","Verify that this ungrouped checkbox input is not related to other checkboxes","Violation Potential","2","1.3.1","" +"input_checkboxes_grouped","potential_unnamedcheckbox","Related sets of radio buttons or checkboxes should be programmatically grouped","Verify that this un-named, ungrouped checkbox input is not related to other checkboxes","Violation Potential","2","1.3.1","" +"table_headers_ref_valid","Pass_0","The 'headers' attribute should refer to a valid cell in the same table","Rule Passed","Pass","2","1.3.1","a25f45:pass" +"table_headers_ref_valid","Fail_1","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not reference a valid 'id' in this document","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_2","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" refers to itself","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_3","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not refer to a cell in the same table","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_4","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not refer to a cell indicated with <th> or a role of ""columnheader"" or ""rowheader""","Violation","2","1.3.1","a25f45:fail" +"fieldset_label_valid","Pass_1","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" with an input has a unique name","Pass","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_1","Groups with nested inputs must have unique accessible name","Group/Fieldset does not have an accessible name","Violation","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_2","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" has a duplicate name to another group","Violation","3","1.3.1,3.3.2","" +"table_scope_valid","Pass_0","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","Rule Passed","Pass","2","1.3.1","" +"table_scope_valid","Fail_1","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","Value provided is invalid for the 'scope' attribute","Violation","2","1.3.1","" +"table_scope_valid","Fail_2","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","The 'scope' attribute should only be used on a <th> element","Violation","2","1.3.1","" +"aria_hidden_nontabbable","Pass_0","A hidden element should not contain any tabbable elements","Rule Passed","Pass","2","1.3.1,4.1.2","6cfa84:pass" +"aria_hidden_nontabbable","Fail_1","A hidden element should not contain any tabbable elements","Element ""{0}"" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'","Violation","2","1.3.1,4.1.2","6cfa84:fail" +"aria_parent_required","Pass_0","Each element with an implicit or explicit role must be contained within a valid element","Rule Passed","Pass","1","1.3.1","ff89c9:pass" +"aria_parent_required","Fail_1","Each element with an implicit or explicit role must be contained within a valid element","Element with ""{0}"" role is not contained in or owned by an element with one of the following roles: ""{1}""","Violation","1","1.3.1","ff89c9:fail" +"form_label_unique","Pass_0","Form controls should have exactly one label","Rule Passed","Pass","1","1.3.1","" +"form_label_unique","Fail_1","Form controls should have exactly one label","Form control has more than one label","Violation","1","1.3.1","" +"label_ref_valid","pass","The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element","The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element","Pass","1","1.3.1","" +"label_ref_valid","fail_invalid","The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element","The value ""{0}"" of the 'for' attribute is not the 'id' of a valid element","Violation","1","1.3.1","" +"table_caption_empty","Pass_0","A <caption> element for a <table> element must contain descriptive text","Rule Passed","Pass","1","1.3.1","" +"table_caption_empty","Fail_1","A <caption> element for a <table> element must contain descriptive text","The <table> element has an empty <caption> element","Violation","1","1.3.1","" +"table_caption_nested","Pass_0","The <caption> element must be nested inside the associated <table> element","Rule Passed","Pass","3","1.3.1","" +"table_caption_nested","Fail_1","The <caption> element must be nested inside the associated <table> element","<caption> element is not nested inside a <table> element","Violation","3","1.3.1","" +"table_headers_exists","Pass_0","Data table must identify headers","Rule Passed","Pass","1","1.3.1","" +"table_headers_exists","Fail_1","Data table must identify headers","Table has no headers identified","Violation","1","1.3.1","" +"table_headers_related","Pass_0","For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes","Rule Passed","Pass","2","1.3.1","" +"table_headers_related","Fail_1","For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes","Complex table does not have headers for each cell properly defined with 'header' or 'scope'","Violation","2","1.3.1","" +"table_structure_misuse","Pass_0","Table elements with 'role=""presentation"" or 'role=""none"" should not have structural elements or attributes","Rule Passed","Pass","2","1.3.1","" +"table_structure_misuse","Fail_1","Table elements with 'role=""presentation"" or 'role=""none"" should not have structural elements or attributes","The <{0}> element with ""presentation"" role or ""none"" role has structural element(s) and/or attribute(s) '{1}'","Violation","2","1.3.1","" +"table_summary_redundant","Pass_0","The table summary must not duplicate the caption","Rule Passed","Pass","3","1.3.1","" +"table_summary_redundant","Fail_1","The table summary must not duplicate the caption","The table summary duplicates the caption","Violation","3","1.3.1","" +"blockquote_cite_exists","Pass_0","Use <blockquote> only for quotations, not indentation","Rule Passed","Pass","3","1.3.1","" +"blockquote_cite_exists","Potential_1","Use <blockquote> only for quotations, not indentation","Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only","Violation Potential","3","1.3.1","" +"heading_markup_misuse","Pass_0","Heading elements must not be used for presentation","Rule Passed","Pass","2","1.3.1","" +"heading_markup_misuse","Potential_1","Heading elements must not be used for presentation","Verify that the heading element is a genuine heading","Violation Potential","2","1.3.1","" +"text_quoted_correctly","Pass_0","Quotations should be marked with <q> or <blockquote> elements","Rule Passed","Pass","3","1.3.1","" +"text_quoted_correctly","Potential_1","Quotations should be marked with <q> or <blockquote> elements","If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}","Violation Potential","3","1.3.1","" +"list_markup_review","potential_list","Proper HTML elements should be used to create a list","Verify this is a list and if so, modify to use proper HTML elements for the list","Violation Potential","3","1.3.1","" +"text_block_heading","potential_heading","Heading text should use a heading element or role","Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role","Violation Potential","1","1.3.1","" +"fieldset_legend_valid","Pass_0"," <fieldset> elements should have a single, non-empty <legend> as a label","Rule Passed","Pass","1","1.3.1","" +"fieldset_legend_valid","Fail_1"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element does not have a <legend>","Rec","1","1.3.1","" +"fieldset_legend_valid","Fail_2"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element has more than one <legend>","Rec","1","1.3.1","" +"fieldset_legend_valid","Fail_3"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element <legend> is empty","Rec","1","1.3.1","" +"aria_child_valid","Pass","An element with an ARIA role must own a required child","An element with an ARIA role owns a required child","Pass","1","1.3.1","bc4a75:pass" +"aria_child_valid","Fail_no_child","An element with an ARIA role must own a required child","The element with role ""{0}"" does not own any child element with any of the following role(s): ""{1}""","Rec","1","1.3.1","bc4a75:fail" +"aria_child_valid","Fail_invalid_child","An element with an ARIA role must own a required child","The element with role ""{0}"" owns the child element with the role ""{1}"" that is not one of the allowed role(s): ""{2}""","Rec","1","1.3.1","bc4a75:fail" +"input_fields_grouped","Pass_0","Groups of logically related input elements should be contained within a <fieldset> element","Rule Passed","Pass","2","1.3.1","" +"input_fields_grouped","Potential_1","Groups of logically related input elements should be contained within a <fieldset> element","Use the <fieldset> element to group logically related input elements","Rec Potential","2","1.3.1","" +"list_structure_proper","Pass_0","List elements should only be used for lists of related items","Rule Passed","Pass","3","1.3.1","" +"list_structure_proper","Potential_1","List elements should only be used for lists of related items","List element is missing or improperly structured","Rec Potential","3","1.3.1","" +"select_options_grouped","Pass_0","Groups of related options within a selection list should be grouped with <optgroup>","Rule Passed","Pass","3","1.3.1","" +"select_options_grouped","Potential_1","Groups of related options within a selection list should be grouped with <optgroup>","Group of related options may need <optgroup>","Rec Potential","3","1.3.1","" +"table_layout_linearized","Pass_0","Avoid using tables to format text documents in columns unless the table can be linearized","Rule Passed","Pass","4","1.3.1","" +"table_layout_linearized","Potential_1","Avoid using tables to format text documents in columns unless the table can be linearized","Verify table is not being used to format text content in columns unless the table can be linearized","Rec Potential","4","1.3.1","" +"dir_attribute_valid","Pass_0","'dir' attribute value must be ""ltr"", ""rtl"", or ""auto""","Rule Passed","Pass","3","1.3.2","" +"dir_attribute_valid","Fail_1","'dir' attribute value must be ""ltr"", ""rtl"", or ""auto""","Invalid value used for the 'dir' attribute","Violation","3","1.3.2","" +"text_whitespace_valid","pass","Space characters should not be used to control spacing within a word","Rule Passed","Pass","3","1.3.2","" +"text_whitespace_valid","potential_text","Space characters should not be used to control spacing within a word","Space characters should not be used to create space between the letters of a word","Violation Potential","3","1.3.2","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"text_sensory_misuse","potential_position","Instructions should be meaningful without relying solely on shape, size, or location words","Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position","Violation Potential","2","1.3.3","" +"text_sensory_misuse","potential_other","Instructions should be meaningful without relying solely on shape, size, or location words","Confirm the user instruction is still understandable without the word(s) '{0}'","Violation Potential","2","1.3.3","" +"element_orientation_unlocked","pass","Elements should not be restricted to either landscape or portrait orientation using CSS transform property","The element is not restricted to either landscape or portrait orientation using CSS transform property","Pass","2","1.3.4","b33eff:pass" +"element_orientation_unlocked","fail_locked","Elements should not be restricted to either landscape or portrait orientation using CSS transform property","The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property","Violation","2","1.3.4","b33eff:fail" +"input_autocomplete_valid","pass","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) is appropriate for the input form field","Pass","3","1.3.5","73f2c2:pass" +"input_autocomplete_valid","fail_inappropriate","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) are not appropriate for the input form field","Violation","3","1.3.5","73f2c2:fail" +"input_autocomplete_valid","fail_invalid","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type","Violation","3","1.3.5","73f2c2:pass" +"input_autocomplete_valid","fail_incorrect","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute has an incorrect value","Violation","3","1.3.5","73f2c2:fail" +"form_font_color","Pass_0","Combine color and descriptive markup to indicate required form fields","Rule Passed","Pass","2","1.4.1","" +"form_font_color","Potential_1","Combine color and descriptive markup to indicate required form fields","Check color is not used as the only visual means to convey which fields are required","Violation Potential","2","1.4.1","" +"style_color_misuse","Pass_0","Combine color and descriptive markup to convey information","Rule Passed","Pass","2","1.4.1","" +"style_color_misuse","Potential_1","Combine color and descriptive markup to convey information","Verify color is not used as the only visual means of conveying information","Violation Potential","2","1.4.1","" +"media_autostart_controllable","Pass_0","Mechanism must be available to pause or stop and control the volume of the audio that plays automatically","Rule Passed","Pass","2","1.4.2","" +"media_autostart_controllable","Potential_1","Mechanism must be available to pause or stop and control the volume of the audio that plays automatically","Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically","Violation Potential","2","1.4.2","" +"text_contrast_sufficient","pass","The contrast ratio of text with its background must meet WCAG AA requirements","The contrast ratio of text with its background meets WCAG AA requirements","Pass","1","1.4.3","afw4f7:pass" +"text_contrast_sufficient","fail_contrast","The contrast ratio of text with its background must meet WCAG AA requirements","Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation","1","1.4.3","afw4f7:fail" +"text_contrast_sufficient","potential_same_color","The contrast ratio of text with its background must meet WCAG AA requirements","The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast","Violation Potential","1","1.4.3","afw4f7:cantTell" +"text_contrast_sufficient","potential_graphic_background","The contrast ratio of text with its background must meet WCAG AA requirements","Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation Potential","1","1.4.3","afw4f7:cantTell" +"text_contrast_sufficient","potential_text_shadow","The contrast ratio of text with its background must meet WCAG AA requirements","Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation Potential","1","1.4.3","afw4f7:cantTell" +"style_viewport_resizable","Pass_0","Text must scale up to 200% without loss of content or functionality","Rule Passed","Pass","3","1.4.4,1.4.10","" +"style_viewport_resizable","Potential_1","Text must scale up to 200% without loss of content or functionality","Verify that text sized using viewport units can be resized up to 200%","Violation Potential","3","1.4.4,1.4.10","" +"meta_viewport_zoomable","pass","The 'meta[name=viewport]' should not prevent the browser zooming the content","The 'meta[name=viewport]' does not prevent the browser zooming the content","Pass","3","1.4.4","" +"meta_viewport_zoomable","potential_zoomable","The 'meta[name=viewport]' should not prevent the browser zooming the content","Confirm the 'meta[name=viewport]' with ""{0}"" can be zoomed by user","Rec Potential","3","1.4.4","" +"style_viewport_resizable","Pass_0","Text must scale up to 200% without loss of content or functionality","Rule Passed","Pass","3","1.4.4,1.4.10","" +"style_viewport_resizable","Potential_1","Text must scale up to 200% without loss of content or functionality","Verify that text sized using viewport units can be resized up to 200%","Violation Potential","3","1.4.4,1.4.10","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"text_spacing_valid","pass","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important is not used in inline style to control letter or word spacing or line height","Pass","3","1.4.12","9e45ec:pass | 24afc2:pass | 78fd32:pass" +"text_spacing_valid","fail_letter_spacing_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘letter-spacing’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"text_spacing_valid","fail_word_spacing_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘word-spacing’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"text_spacing_valid","fail_line_height_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘line-height’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"style_hover_persistent","Pass_0","The pointer should be able to move over content displayed on hover","the hover: pseudo-class is not used to display content","Pass","2","1.4.13","" +"style_hover_persistent","Pass_2","The pointer should be able to move over content displayed on hover","content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element","Pass","2","1.4.13","" +"style_hover_persistent","Potential_1","The pointer should be able to move over content displayed on hover","Confirm the pointer can be positioned over the displayed element, not just the trigger","Violation Potential","2","1.4.13","" +"style_hover_persistent","Potential_2","The pointer should be able to move over content displayed on hover","Confirm the pointer can be positioned over all the information displayed on hover","Violation Potential","2","1.4.13","" +"style_hover_persistent","Potential_3","The pointer should be able to move over content displayed on hover","Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger","Violation Potential","2","1.4.13","" +"element_scrollable_tabbable","pass_tabbable","Scrollable elements should be tabbable or contain tabbable content","The scrollable element is tabbable","Pass","1","2.1.1","0ssw9k:pass" +"element_scrollable_tabbable","pass_interactive","Scrollable elements should be tabbable or contain tabbable content","The scrollable element has tabbable content","Pass","1","2.1.1","0ssw9k:pass" +"element_scrollable_tabbable","fail_scrollable","Scrollable elements should be tabbable or contain tabbable content","The scrollable element <{0}> with non-interactive content is not tabbable","Violation","1","2.1.1","0ssw9k:fail" +"aria_activedescendant_tabindex_valid","pass","Element using 'aria-activedescendant' property should be tabbable","Rule Passed","Pass","1","2.1.1","" +"aria_activedescendant_tabindex_valid","Fail_1","Element using 'aria-activedescendant' property should be tabbable","The <{0}> element using 'aria-activedescendant' set to ""{1}"" is not tabbable","Violation","1","2.1.1","" +"aria_child_tabbable","pass","UI component must have at least one tabbable descendant for keyboard access","Rule Passed","Pass","1","2.1.1","" +"aria_child_tabbable","fail_missing_child","UI component must have at least one tabbable descendant for keyboard access","None of the descendent elements with ""{1}"" role is tabbable","Violation","1","2.1.1","" +"iframe_interactive_tabbable","pass","Iframe with interactive content should not be excluded from tab order using tabindex","The iframe with interactive content is not excluded from the tab order using tabindex","Pass","1","2.1.1","akn7bn:pass" +"iframe_interactive_tabbable","fail_invalid","Iframe with interactive content should not be excluded from tab order using tabindex","The <iframe> with interactive content is excluded from tab order using tabindex","Violation","1","2.1.1","akn7bn:fail" +"application_content_accessible","Pass_0","Non-decorative static text and image content within an element with ""application"" role must be accessible","Rule Passed","Pass","1","1.1.1,2.1.1","" +"application_content_accessible","Potential_1","Non-decorative static text and image content within an element with ""application"" role must be accessible","Verify that the non-decorative static text and image content within an element with ""application"" role are accessible","Violation Potential","1","1.1.1,2.1.1","" +"aria_keyboard_handler_exists","pass","Interactive WAI_ARIA UI components must provide keyboard access","Rule Passed","Pass","1","2.1.1","" +"aria_keyboard_handler_exists","potential_no_keyboard_access","Interactive WAI_ARIA UI components must provide keyboard access","Verify the <{0}> element with ""{1}"" role has keyboard access","Violation Potential","1","2.1.1","" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"script_onclick_misuse","Pass_0","Scripts should not be used to emulate links","Rule Passed","Pass","1","2.1.1","" +"script_onclick_misuse","Potential_1","Scripts should not be used to emulate links","Possible use of a script to emulate a link","Violation Potential","1","2.1.1","" +"widget_tabbable_exists","pass","Component must have at least one tabbable element","Rule Passed","Pass","1","2.1.1","" +"widget_tabbable_exists","fail_no_tabbable","Component must have at least one tabbable element","Component with ""{0}"" role does not have a tabbable element","Violation Potential","1","2.1.1","" +"widget_tabbable_single","pass","Components with a widget role must have no more than one tabbable element","Components with a widget role should have no more than one tabbable element","Pass","1","2.1.1,2.4.3","" +"widget_tabbable_single","potential_multiple_tabbable","Components with a widget role must have no more than one tabbable element","Component with ""{0}"" role has more than one tabbable element","Violation Potential","1","2.1.1,2.4.3","" +"media_keyboard_controllable","Pass_0","Media using <audio> and/or <video> elements must have keyboard accessible controls","Rule Passed","Pass","2","2.1.1","" +"media_keyboard_controllable","Manual_1","Media using <audio> and/or <video> elements must have keyboard accessible controls","Verify media using <audio> and/or <video> elements have keyboard accessible controls","Violation Manual","2","2.1.1","" +"script_onclick_avoid","Pass_0","Scripts should not be used to emulate links","Rule Passed","Pass","4","2.1.1","" +"script_onclick_avoid","Potential_1","Scripts should not be used to emulate links","Verify that 'onclick' events are not used in script to emulate a link","Rec Potential","4","2.1.1","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"element_mouseevent_keyboard","Pass_0","All interactive content with mouse event handlers must have equivalent keyboard access","Rule Passed","Pass","1","2.1.1","" +"element_mouseevent_keyboard","Manual_1","All interactive content with mouse event handlers must have equivalent keyboard access","Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)","Rec Manual","1","2.1.1","" +"download_keyboard_controllable","Manual_1","File download mechanisms should be keyboard-operable and preserve page focus location","Verify that the file download mechanism does not cause a keyboard trap","Rec Manual","1","2.1.2","" +"meta_redirect_optional","pass","Page should not automatically refresh without warning or option to turn it off or adjust the time limit","Rule Passed","Pass","3","2.2.1","bc659a:pass" +"meta_redirect_optional","fail","Page should not automatically refresh without warning or option to turn it off or adjust the time limit","Check page does not automatically refresh without warning or options","Violation","3","2.2.1","bc659a:fail" +"meta_redirect_optional","fail_longrefresh","Page should not automatically refresh without warning or option to turn it off or adjust the time limit","Check page does not automatically refresh without warning or options","Violation","3","2.2.1","bc659a:pass" +"meta_refresh_delay","Pass_0","Pages should not refresh automatically","Rule Passed","Pass","3","2.2.1","bisz58:pass | bc659a:pass" +"meta_refresh_delay","Potential_1","Pages should not refresh automatically","Verify page is not being caused to refresh automatically","Violation Potential","3","2.2.1","bisz58:cantTell | bc659a:cantTell" +"blink_elem_deprecated","Fail_1","Content that blinks persistently must not be used","Content found that blinks persistently","Violation","2","2.2.2","" +"marquee_elem_avoid","Fail_1","The <marquee> element is obsolete and should not be used","Scrolling content found that uses the obsolete <marquee> element","Violation","3","2.2.2","" +"blink_css_review","Pass_0","Do not use the ""blink"" value of the 'text-decoration' property for longer than five seconds","Rule Passed","Pass","2","2.2.2","" +"blink_css_review","Potential_1","Do not use the ""blink"" value of the 'text-decoration' property for longer than five seconds","Check the ""blink"" value of the CSS 'text-decoration' property is not used for more than than five seconds","Violation Potential","2","2.2.2","" +"aria_application_label_unique","Pass_0","Each element with ""application"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_application_label_unique","Fail_1","Each element with ""application"" role must have a unique label that describes its purpose","Multiple elements with ""application"" role do not have unique labels","Violation","3","2.4.1","" +"aria_application_labelled","Pass_0","Each element with ""application"" role must have a label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_application_labelled","Fail_1","Each element with ""application"" role must have a label that describes its purpose","Element with ""application"" role does not have a label","Violation","3","2.4.1","" +"aria_article_label_unique","Pass_0","Each element with ""article"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_article_label_unique","Fail_1","Each element with ""article"" role must have a unique label that describes its purpose","Multiple elements with ""article"" role do not have unique labels","Violation","3","2.4.1","" +"aria_banner_label_unique","Pass_0","Each element with ""banner"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_banner_label_unique","Fail_1","Each element with ""banner"" role must have a unique label that describes its purpose","Multiple elements with ""banner"" role do not have unique labels","Violation","3","2.4.1","" +"aria_banner_single","Pass_0","A page, document, or application should only have one element with ""banner"" role","Rule Passed","Pass","3","2.4.1","" +"aria_banner_single","Fail_1","A page, document, or application should only have one element with ""banner"" role","Multiple elements with ""banner"" role found on the page","Violation","3","2.4.1","" +"aria_complementary_label_unique","Pass_0","Each element with ""complementary"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_complementary_label_unique","Fail_1","Each element with ""complementary"" role must have a unique label that describes its purpose","Multiple elements with ""complementary"" role do not have unique labels","Violation","3","2.4.1","" +"aria_complementary_labelled","Pass_0","Each element with ""complementary"" role must have a label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_complementary_labelled","Fail_1","Each element with ""complementary"" role must have a label that describes its purpose","Element with ""complementary"" role does not have a label","Violation","3","2.4.1","" +"aria_content_in_landmark","Pass_0","All content must reside within an element with a landmark role","Rule Passed","Pass | Pass","3 | 3","2.4.1 | 2.4.1","" +"aria_content_in_landmark","Fail_1","All content must reside within an element with a landmark role","Content is not within a landmark element","Violation | Rec","3 | 3","2.4.1 | 2.4.1","" +"aria_contentinfo_label_unique","Pass_0","Each element with ""contentinfo"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_contentinfo_label_unique","Fail_1","Each element with ""contentinfo"" role must have a unique label that describes its purpose","Multiple elements with ""contentinfo"" role do not have unique labels","Violation","3","2.4.1","" +"aria_contentinfo_single","Pass_0","A page, document, or application should only have one element with ""contentinfo"" role","Rule Passed","Pass","3","2.4.1","" +"aria_contentinfo_single","Fail_1","A page, document, or application should only have one element with ""contentinfo"" role","Multiple elements with ""contentinfo"" role found on the page","Violation","3","2.4.1","" +"aria_document_label_unique","Pass_0","Each element with ""document"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_document_label_unique","Fail_1","Each element with ""document"" role must have a unique label that describes its purpose","Multiple elements with ""document"" roles do not have unique labels","Violation","3","2.4.1","" +"aria_form_label_unique","Pass_0","Each element with ""form"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_form_label_unique","Fail_1","Each element with ""form"" role must have a unique label that describes its purpose","Multiple elements with ""form"" role do not have unique labels","Violation","3","2.4.1","" +"aria_landmark_name_unique","Pass_0","Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region","Multiple elements with ""{0}"" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'","Pass | Pass","3 | 3","2.4.1 | 2.4.1","" +"aria_landmark_name_unique","Fail_0","Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region","Multiple elements with ""{0}"" landmarks within the same parent region are not distinguished from one another because they have the same ""{1}"" label","Violation | Rec","3 | 3","2.4.1 | 2.4.1","" +"aria_main_label_unique","Pass_0","Each element with ""main"" role must have unique label that describes its purposes","Rule Passed","Pass","3","2.4.1","" +"aria_main_label_unique","Fail_1","Each element with ""main"" role must have unique label that describes its purposes","Multiple elements with ""main"" role do not have unique labels","Violation","3","2.4.1","" +"aria_navigation_label_unique","Pass_0","Each element with ""navigation"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_navigation_label_unique","Fail_1","Each element with ""navigation"" role must have a unique label that describes its purpose","Multiple elements with ""navigation"" role do not have unique labels","Violation","3","2.4.1","" +"aria_region_label_unique","Pass_0","Each element with ""region"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_region_label_unique","Fail_1","Each element with ""region"" role must have a unique label that describes its purpose","Multiple elements with ""region"" role do not have unique labels","Violation","3","2.4.1","" +"aria_region_labelled","Pass_0","Each element with ""region"" role must have a label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_region_labelled","Fail_1","Each element with ""region"" role must have a label that describes its purpose","Element with ""region"" role does not have a label","Violation","3","2.4.1","" +"aria_search_label_unique","Pass_0","Each element with ""search"" role must have a unique label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_search_label_unique","Fail_1","Each element with ""search"" role must have a unique label that describes its purpose","Multiple elements with ""search"" role do not have unique labels","Violation","3","2.4.1","" +"aria_toolbar_label_unique","Pass_0","Each element with ""toolbar"" role must have a unique label that describes its purpose","Rule Passed","Pass","1","2.4.1","" +"aria_toolbar_label_unique","Fail_1","Each element with ""toolbar"" role must have a unique label that describes its purpose","Multiple elements with ""toolbar"" roles do not have unique labels","Violation","1","2.4.1","" +"skip_main_exists","Pass_0","Pages must provide a way to skip directly to the main content","Rule Passed","Pass","3","2.4.1","" +"skip_main_exists","Fail_1","Pages must provide a way to skip directly to the main content","The page does not provide a way to quickly navigate to the main content (ARIA ""main"" landmark or a skip link)","Violation","3","2.4.1","" +"frame_src_valid","Pass_0","A <frame> containing non-HTML content must be made accessible","Rule Passed","Pass","3","2.4.1","" +"frame_src_valid","Potential_1","A <frame> containing non-HTML content must be made accessible","Verify <frame> content is accessible","Violation Potential","3","2.4.1","" +"html_skipnav_exists","Pass_0","Provide a way to bypass blocks of content that are repeated on multiple Web pages","Rule Passed","Pass","3","2.4.1","" +"html_skipnav_exists","Potential_1","Provide a way to bypass blocks of content that are repeated on multiple Web pages","Verify there is a way to bypass blocks of content that are repeated on multiple Web pages","Violation Potential","3","2.4.1","" +"skip_main_described","Pass_0","The description of a hyperlink used to skip content must communicate where it links to","Rule Passed","Pass","3","2.4.1","" +"skip_main_described","Potential_1","The description of a hyperlink used to skip content must communicate where it links to","Verify that if this hyperlink skips content, the description communicates where it links to","Violation Potential","3","2.4.1","" +"aria_complementary_label_visible","Pass_0","Each element with ""complementary"" role should have a visible label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_complementary_label_visible","Fail_1","Each element with ""complementary"" role should have a visible label that describes its purpose","Element with ""complementary"" role does not have a visible label","Rec","3","2.4.1","" +"aria_contentinfo_misuse","Pass_0","Each element with ""contentinfo"" role is only permitted with an element with ""main"" role","Rule Passed","Pass","3","2.4.1","" +"aria_contentinfo_misuse","Fail_1","Each element with ""contentinfo"" role is only permitted with an element with ""main"" role","Element with ""contentinfo"" role is present without an element with ""main"" role","Rec","3","2.4.1","" +"aria_main_label_visible","Pass_0","Each element with ""main"" role should have a unique visible label that describes its purpose","Rule Passed","Pass","3","2.4.1","" +"aria_main_label_visible","Fail_1","Each element with ""main"" role should have a unique visible label that describes its purpose","Multiple elements with ""main"" role do not have unique visible labels","Rec","3","2.4.1","" +"page_title_exists","Pass_0","The page should have a title that correctly identifies the subject of the page","Rule Passed","Pass","1","2.4.2","2779a5:pass" +"page_title_exists","Fail_1","The page should have a title that correctly identifies the subject of the page","Missing <head> element so there can be no <title> element present","Violation","1","2.4.2","2779a5:pass" +"page_title_exists","Fail_2","The page should have a title that correctly identifies the subject of the page","Missing <title> element in <head> element","Violation","1","2.4.2","2779a5:fail" +"page_title_exists","Fail_3","The page should have a title that correctly identifies the subject of the page","The <title> element is empty (no innerHTML)","Violation","1","2.4.2","2779a5:fail" +"page_title_valid","Pass_0","Page <title> should be a descriptive title, rather than a filename","Rule Passed","Pass","1","2.4.2","" +"page_title_valid","Potential_2","Page <title> should be a descriptive title, rather than a filename","Verify that using the filename as the page <title> value is descriptive","Violation Potential","1","2.4.2","" +"widget_tabbable_single","pass","Components with a widget role must have no more than one tabbable element","Components with a widget role should have no more than one tabbable element","Pass","1","2.1.1,2.4.3","" +"widget_tabbable_single","potential_multiple_tabbable","Components with a widget role must have no more than one tabbable element","Component with ""{0}"" role has more than one tabbable element","Violation Potential","1","2.1.1,2.4.3","" +"img_alt_redundant","Pass_0","The text alternative for an image within a link should not repeat the link text or adjacent link text","Rule Passed","Pass","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_1","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text is repeated in an image 'alt' value within the same link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_2","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text of previous link is repeated in image 'alt' value of a link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_3","The text alternative for an image within a link should not repeat the link text or adjacent link text","Image 'alt' value within a link is repeated in link text of the link after","Violation","2","1.1.1,2.4.4","" +"a_text_purpose","pass","Hyperlinks must have an accessible name for their purpose","Hyperlink has a description of its purpose","Pass","2","2.4.4,4.1.2","c487ae:pass" +"a_text_purpose","fail_acc_name","Hyperlinks must have an accessible name for their purpose","Hyperlink has no link text, label or image with a text alternative","Violation","2","2.4.4,4.1.2","c487ae:fail" +"heading_content_exists","Pass_0","Heading elements must provide descriptive text","Heading element has descriptive text","Pass","1","2.4.6","" +"heading_content_exists","Fail_1","Heading elements must provide descriptive text","Heading element has no descriptive content","Rec","1","2.4.6","" +"element_tabbable_visible","pass","A tabbable element should be visible on the screen when it has keyboard focus","The tabbable element is visible on the screen","Pass","1","2.4.7","" +"element_tabbable_visible","potential_visible","A tabbable element should be visible on the screen when it has keyboard focus","Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus","Violation Potential","1","2.4.7","" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"style_focus_visible","potential_focus_not_visible","The keyboard focus indicator should be visible when default border or outline is modified by CSS","Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'","Violation Potential","1","2.4.7","" +"style_focus_visible","pass_focus_visible","The keyboard focus indicator should be visible when default border or outline is modified by CSS","The keyboard focus indicator is visible or is not changed from the browser default","Pass","1","2.4.7","" +"element_tabbable_unobscured","pass","When an element receives focus, it is not entirely covered by other content","The element is not entirely covered by other content","Pass","3","2.4.11","" +"element_tabbable_unobscured","potential_obscured","When an element receives focus, it is not entirely covered by other content","Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus","Violation Potential","3","2.4.11","" +"label_name_visible","Pass_0","Accessible name must match or contain the visible label text","Accessible name matches or contains the visible label text","Pass","2","2.5.3","2ee8b8:pass" +"label_name_visible","Fail_1","Accessible name must match or contain the visible label text","Accessible name does not match or contain the visible label text","Violation","2","2.5.3","2ee8b8:fail" +"input_label_visible","pass","An input element must have an associated visible label","The input element has an associated visible label","Pass","1","2.5.3,3.3.2","" +"input_label_visible","potential_placeholder_only","An input element must have an associated visible label","The ‘placeholder’ is the only visible label","Violation Potential","1","2.5.3,3.3.2","" +"input_label_visible","potential_no_label","An input element must have an associated visible label","The input element does not have an associated visible label","Violation Potential","1","2.5.3,3.3.2","" +"draggable_alternative_exists","pass_undraggable","A draggable element must have a ""single pointer"" alternative","The element ""{0}"" is not draggable","Pass","3","2.5.7","" +"draggable_alternative_exists","potential_alternative","A draggable element must have a ""single pointer"" alternative","Ensure the draggable element ""{0}"" has a ""single pointer"" alternative","Violation Potential","3","2.5.7","" +"target_spacing_sufficient","pass_spacing","The target must be sufficiently sized or spaced from other targets","The target's spacing from other targets is sufficient","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_sized","The target must be sufficiently sized or spaced from other targets","The target’s size is more than 24 CSS pixels","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_inline","The target must be sufficiently sized or spaced from other targets","The target is in a sentence or its size is otherwise constrained by the line-height of non-target text","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_default","The target must be sufficiently sized or spaced from other targets","The target's size is determined by the user agent and is not modified by the author","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","violation_spacing","The target must be sufficiently sized or spaced from other targets","Undersized target ""{0}"" does not have sufficient spacing of 12 CSS pixels from another target ""{1}""","Violation | Rec","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","potential_overlap","The target must be sufficiently sized or spaced from other targets","Ensure the overlapped target ""{0}"" meets a minimum target size or has sufficient spacing from the overlapping target ""{1}""","Violation Potential | Rec Potential","3 | 3","2.5.8 | 2.5.8","" +"html_lang_exists","Pass_0","Page must identify the default language of the document with a 'lang' attribute","Page language detected as ""{0}""","Pass","1","3.1.1","b5c3f8:pass | 5b7ae0:pass" +"html_lang_exists","Fail_1","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Fail_2","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML, but does not have an 'xml:lang' attribute","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Fail_3","Page must identify the default language of the document with a 'lang' attribute","Page detected as HTML, but does not have a 'lang' attribute","Violation","1","3.1.1","b5c3f8:fail | 5b7ae0:inapplicable" +"html_lang_exists","Fail_4","Page must identify the default language of the document with a 'lang' attribute","Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: ""{0}"", ""{1}""","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:fail" +"html_lang_exists","Fail_5","Page must identify the default language of the document with a 'lang' attribute","Page detected with 'lang' and 'xml:lang' attributes that do not match: ""{0}"", ""{1}""","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:pass" +"html_lang_exists","Potential_5","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type","Violation Potential","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Potential_6","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type","Violation Potential","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_valid","Pass_0","The default human language of the page must be valid and specified in accordance with BCP 47","Lang has a valid primary lang and conforms to BCP 47","Pass","1","3.1.1","b5c3f8:pass | bf051a:pass" +"html_lang_valid","Fail_1","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not include a valid primary language","Violation","1","3.1.1","b5c3f8:fail | bf051a:fail" +"html_lang_valid","Fail_2","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not conform to BCP 47","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:pass" +"html_lang_valid","Fail_3","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not include a valid primary language","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:fail" +"html_lang_valid","Fail_4","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not conform to BCP 47","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:inapplicable" +"element_lang_valid","Pass_0","The change in language of specific content must be valid and specified in accordance with BCP 47","Lang has a valid primary lang and conforms to BCP 47","Pass","3","3.1.2","de46e4:pass" +"element_lang_valid","Fail_1","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not include a valid primary language","Violation","3","3.1.2","de46e4:fail" +"element_lang_valid","Fail_2","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not conform to BCP 47","Violation","3","3.1.2","de46e4:pass" +"element_lang_valid","Fail_3","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not include a valid primary language","Violation","3","3.1.2","de46e4:inapplicable" +"element_lang_valid","Fail_4","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not conform to BCP 47","Violation","3","3.1.2","de46e4:inapplicable" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"script_select_review","Pass_0","No changes of context should occur when a selection value receives focus","Rule Passed","Pass","3","3.2.1","" +"script_select_review","Potential_1","No changes of context should occur when a selection value receives focus","Verify that no change of context or action occurs when selection options in this component receive focus","Violation Potential","3","3.2.1","" +"form_interaction_review","Pass_0","User should be informed in advance when interacting with content causes a change of context","Rule Passed","Pass","3","3.2.2","" +"form_interaction_review","Potential_1","User should be informed in advance when interacting with content causes a change of context","Verify that interacting with content will not open pop-up windows or change the active window without informing the user","Violation Potential","3","3.2.2","" +"form_submit_button_exists","Pass_0","A <form> element should have a submit button or an image button","Rule Passed","Pass","3","3.2.2","" +"form_submit_button_exists","Potential_1","A <form> element should have a submit button or an image button","Verify the <form> element has a submit button or an image button","Violation Potential","3","3.2.2","" +"input_onchange_review","potential_warning","Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs","Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs","Violation Potential","3","3.2.2","" +"a_target_warning","pass","Users should be warned in advance if their input action will open a new window","The user is warned in advance that the input action opens a new window","Pass","3","3.2.2","" +"a_target_warning","potential_warn","Users should be warned in advance if their input action will open a new window","Inform the user when their input action will open a new window","Rec Potential","3","3.2.2","" +"error_message_exists","Pass_0","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Rule Passed","Pass","1","3.3.1","" +"error_message_exists","Fail_1","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Custom error message has invalid reference 'id' value","Violation","1","3.3.1","" +"error_message_exists","Fail_2","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Custom error message is not visible","Violation","1","3.3.1","" +"fieldset_label_valid","Pass_1","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" with an input has a unique name","Pass","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_1","Groups with nested inputs must have unique accessible name","Group/Fieldset does not have an accessible name","Violation","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_2","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" has a duplicate name to another group","Violation","3","1.3.1,3.3.2","" +"input_label_after","Pass_0","Checkboxes and radio buttons must have a label after the input control","Rule Passed","Pass","1","3.3.2","" +"input_label_after","Fail_1","Checkboxes and radio buttons must have a label after the input control","Checkbox or radio button is nested in label, so label is not after the input control","Violation","1","3.3.2","" +"input_label_after","Fail_2","Checkboxes and radio buttons must have a label after the input control","Label text is located before its associated checkbox or radio button element","Violation","1","3.3.2","" +"input_label_before","Pass_0","Text inputs and <select> elements must have a label before the input control","Rule Passed","Pass","1","3.3.2","" +"input_label_before","Fail_1","Text inputs and <select> elements must have a label before the input control","Text input is nested in label such that input precedes the label text","Violation","1","3.3.2","" +"input_label_before","Fail_2","Text inputs and <select> elements must have a label before the input control","Label text is located after its associated text input or <select> element","Violation","1","3.3.2","" +"input_label_visible","pass","An input element must have an associated visible label","The input element has an associated visible label","Pass","1","2.5.3,3.3.2","" +"input_label_visible","potential_placeholder_only","An input element must have an associated visible label","The ‘placeholder’ is the only visible label","Violation Potential","1","2.5.3,3.3.2","" +"input_label_visible","potential_no_label","An input element must have an associated visible label","The input element does not have an associated visible label","Violation Potential","1","2.5.3,3.3.2","" +"element_accesskey_labelled","Pass_0","An element with an assigned 'accesskey' attribute must have an associated label","Rule Passed","Pass","1","3.3.2","" +"element_accesskey_labelled","Potential_1","An element with an assigned 'accesskey' attribute must have an associated label","The element with an assigned 'accesskey' attribute does not have an associated label","Rec Potential","1","3.3.2","" +"combobox_popup_reference","Pass_1.0_expanded","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Pass_1.0_collapsed","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup in its collapsed state does not reference any visible popup as required","Pass","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Pass_1.2_expanded","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass","1","4.1.2","4e8ab6:pass" +"combobox_popup_reference","Pass_1.2_collapsed","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup in its collapsed state does not reference any visible popup as required","Pass","1","4.1.2","4e8ab6:pass" +"combobox_popup_reference","Fail_1.0_missing_owns","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-owns' attribute of the expanded combobox is missing","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_1.2_missing_controls","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-controls' attribute of the expanded combobox is missing","Violation","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Fail_1.0_popup_reference_missing","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-owns' attribute ""{0}"" of the expanded combobox does not reference a valid popup 'id' value","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_1.2_popup_reference_missing","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-controls' attribute ""{0}"" of the expanded combobox does not reference a valid popup 'id' value","Violation","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Fail_combobox_expanded_hidden","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_combobox_collapsed_visible","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox 'aria-expanded' attribute is false, but the combobox popup is visible","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_active_descendant","Pass","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","'aria-activedescendant' is used appropriately for this combobox","Pass","1","4.1.2","" +"combobox_active_descendant","Fail_missing","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The element referenced by 'aria-activedescendant' ""{0}"" does not exist","Violation","1","4.1.2","" +"combobox_active_descendant","Fail_not_in_popup","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The element referenced by 'aria-activedescendant' ""{0}"" does not exist within the popup referenced by 'id' ""{1}""","Pass","1","4.1.2","" +"combobox_active_descendant","Fail_active_role_invalid","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The 'aria-activedescendant' ""{0}"" references an element with the roles ""{1}"", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'","Violation","1","4.1.2","" +"combobox_active_descendant","Fail_active_not_selected","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The 'aria-activedescendant' ""{0}"" references an element that does not have 'aria-selected' set to true","Violation","1","4.1.2","" +"aria_activedescendant_valid","Pass_0","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","Rule Passed","Pass","1","4.1.2","" +"aria_activedescendant_valid","Fail_1","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","The 'aria-activedescendant' property is empty","Violation","1","4.1.2","" +"aria_activedescendant_valid","Fail_2","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","The 'aria-activedescendant' property references a hidden node","Violation","1","4.1.2","" +"aria_activedescendant_valid","Fail_3","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","Element is not a combobox, and the referenced active-descendant element is not a valid descendant","Violation","1","4.1.2","" +"input_haspopup_conflict","potential_type_misuse","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The <input> element with type ""{0}"" and 'list' attribute uses an explicit 'aria-haspopup' attribute","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","potential_misuse","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","potential_list_notexist","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element is invalid","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","fail_invalid_list_type","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element with the type ""{0}"" is invalid","Violation","1","4.1.2","" +"input_haspopup_conflict","fail_invalid_list_elem","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element does not reference a datalist element","Violation","1","4.1.2","" +"aria_role_valid","Pass_0","ARIA roles must be valid for the element to which they are assigned","Rule Passed","Pass","1","4.1.2","" +"aria_role_valid","Fail_1","ARIA roles must be valid for the element to which they are assigned","The ARIA role '{0}' is not valid for the element <{1}>","Violation","1","4.1.2","" +"aria_role_valid","Fail_2","ARIA roles must be valid for the element to which they are assigned","The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable","Violation","1","4.1.2","" +"combobox_autocomplete_valid","Pass","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox does not use 'aria-autocomplete' value '""inline""' nor does it have 'aria-autocomplete' defined within the popup","Pass","1","4.1.2","" +"combobox_autocomplete_valid","Fail_1","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by ""{0}""","Violation","1","4.1.2","" +"combobox_autocomplete_valid","Fail_inline","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox does not support an 'aria-autocomplete' attribute value set to '""inline""' ","Violation","1","4.1.2","" +"combobox_focusable_elements","Pass","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","DOM focus is allowed only on the combobox element as required","Pass","1","4.1.2","" +"combobox_focusable_elements","Fail_not_tabbable","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","The combobox element does not allow DOM focus as required","Violation","1","4.1.2","" +"combobox_focusable_elements","Fail_tabbable_child","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed","Violation","1","4.1.2","" +"combobox_haspopup_valid","Pass","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value","Pass","1","4.1.2","" +"combobox_haspopup_valid","Fail_popup_role_invalid","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The 'role' value ""{0}"" of the popup element ""{1}"" should be one of ""listbox"", ""grid"", ""tree"" or ""dialog""","Violation","1","4.1.2","" +"combobox_haspopup_valid","Fail_combobox_popup_role_mismatch","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The value of the combobox 'aria-haspopup' attribute ""{0}"" does not match the 'role' value of the popup element ""{1}""","Violation","1","4.1.2","" +"element_tabbable_role_valid","pass","A tabbable element must have a valid widget role","The tabbable element has a widget role","Pass | Pass","1 | 1","4.1.2 | 4.1.2","" +"element_tabbable_role_valid","fail_invalid_role","A tabbable element must have a valid widget role","The tabbable element's role '{0}' is not a widget role","Violation | Rec","1 | 1","4.1.2 | 4.1.2","" +"element_tabbable_role_valid","fail_no_valid_role","A tabbable element must have a valid widget role","The tabbable element does not have a valid widget role","Violation | Rec","1 | 1","4.1.2 | 4.1.2","" +"input_label_exists","Pass_0","Each form control must have an associated label","Rule Passed","Pass","1","4.1.2","97a4e1:pass | e086e5:pass" +"input_label_exists","Fail_1","Each form control must have an associated label","Form control element <{0}> has no associated label","Violation","1","4.1.2","97a4e1:fail | e086e5:fail" +"input_label_exists","Fail_2","Each form control must have an associated label","Form control with ""{0}"" role has no associated label","Violation","1","4.1.2","97a4e1:fail | e086e5:fail" +"aria_descendant_valid","pass","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element contains valid descendants","Pass","1","4.1.2","307n5z:pass" +"aria_descendant_valid","potential_child_implicit_role","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element with role ""{0}"" contains descendants with implicit roles ""{1}"" which are ignored by browsers","Violation Potential","1","4.1.2","307n5z:cantTell" +"aria_descendant_valid","fail_child_explicit_role","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element with role ""{0}"" contains descendants with roles ""{1}"" which are ignored by browsers","Violation","1","4.1.2","307n5z:fail" +"aria_role_allowed","Pass_0","Elements must have a valid 'role' per ARIA specification","Rule Passed","Pass","1","4.1.2","674b10:pass" +"aria_role_allowed","Fail_2","Elements must have a valid 'role' per ARIA specification","The role '{0}' defined on the element is not valid per ARIA specification","Violation","1","4.1.2","674b10:fail" +"aria_role_allowed","Potential_1","Elements must have a valid 'role' per ARIA specification","Some of the roles, '{0}', defined on the element are not valid per ARIA specification","Violation Potential","1","4.1.2","674b10:cantTell" +"label_content_exists","Pass_Regular","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name with inner content","Pass","1","4.1.2","" +"label_content_exists","Pass_AriaLabel","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name via 'aria-label'","Pass","1","4.1.2","" +"label_content_exists","Pass_LabelledBy","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name via 'aria-labelledby'","Pass","1","4.1.2","" +"label_content_exists","Fail_1","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","The <label> element does not have descriptive text that identifies the expected input","Violation","1","4.1.2","" +"combobox_design_valid","Pass_1.0","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Pass","1","4.1.2","" +"combobox_design_valid","Fail_1.1","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Violation","1","4.1.2","" +"combobox_design_valid","Pass_1.2","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.2","Pass","1","4.1.2","" +"a_text_purpose","pass","Hyperlinks must have an accessible name for their purpose","Hyperlink has a description of its purpose","Pass","2","2.4.4,4.1.2","c487ae:pass" +"a_text_purpose","fail_acc_name","Hyperlinks must have an accessible name for their purpose","Hyperlink has no link text, label or image with a text alternative","Violation","2","2.4.4,4.1.2","c487ae:fail" +"aria_attribute_allowed","Pass_0","ARIA attributes must be valid for the element's role","Rule Passed","Pass","1","4.1.2","5f99a7:pass" +"aria_attribute_allowed","Fail_1","ARIA attributes must be valid for the element's role","The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property","Violation","1","4.1.2","5f99a7:fail" +"aria_attribute_exists","pass","When specifying a required ARIA attribute, the value must not be empty","Rule Passed","Pass","1","4.1.2","6a7281:pass" +"aria_attribute_exists","fail_empty_attribute","When specifying a required ARIA attribute, the value must not be empty","The element attribute(s): '{0}' value is empty","Violation","1","4.1.2","6a7281:fail" +"aria_attribute_required","pass","The required attributes for the element with a role must be defined","The required attributes for the element with the role are defined","Pass","1","4.1.2","4e8ab6:pass" +"aria_attribute_required","fail_missing","The required attributes for the element with a role must be defined","Element with '{0}' role does not have the required ARIA attribute(s): '{1}'","Violation","1","4.1.2","4e8ab6:fail" +"aria_attribute_value_valid","Pass_0","ARIA property values must be valid","Rule Passed","Pass","1","4.1.2","6a7281:pass" +"aria_attribute_value_valid","Fail_1","ARIA property values must be valid","The value ""{0}"" specified for attribute '{1}' on element <{2}> is not valid","Violation","1","4.1.2","6a7281:fail" +"aria_eventhandler_role_valid","Pass_0","Elements with event handlers must have a valid ARIA role","Rule Passed","Pass","1","4.1.2","" +"aria_eventhandler_role_valid","Fail_1","Elements with event handlers must have a valid ARIA role","The <{0}> element with '{1}' does not have a valid ARIA role specified","Violation","1","4.1.2","" +"aria_hidden_nontabbable","Pass_0","A hidden element should not contain any tabbable elements","Rule Passed","Pass","2","1.3.1,4.1.2","6cfa84:pass" +"aria_hidden_nontabbable","Fail_1","A hidden element should not contain any tabbable elements","Element ""{0}"" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'","Violation","2","1.3.1,4.1.2","6cfa84:fail" +"aria_id_unique","Pass_0","The ARIA property must reference a non-empty unique id of an existing element that is visible","Rule Passed","Pass","1","4.1.2","59796f:pass | 6a7281:pass" +"aria_id_unique","Fail_1","The ARIA property must reference a non-empty unique id of an existing element that is visible","The 'id' ""{0}"" specified for the ARIA property '{1}' value is not valid","Violation","1","4.1.2","59796f:fail | 6a7281:fail" +"aria_widget_labelled","Pass_0","Interactive component must have a programmatically associated name","Rule Passed","Pass","1","4.1.2","m6b1q3:pass" +"aria_widget_labelled","Fail_1","Interactive component must have a programmatically associated name","Interactive component with ARIA role '{0}' does not have a programmatically associated name","Violation","1","4.1.2","m6b1q3:fail" +"frame_title_exists","Pass_0","Inline frames must have a unique, non-empty 'title' attribute","Rule Passed","Pass","3","4.1.2","cae760:pass" +"frame_title_exists","Fail_1","Inline frames must have a unique, non-empty 'title' attribute","Inline frame does not have a 'title' attribute","Violation","3","4.1.2","cae760:fail" +"list_children_valid","Pass_0","List component with ""group"" role must limit children to <listitem> elements","Rule Passed","Pass","1","4.1.2","" +"list_children_valid","Fail_1","List component with ""group"" role must limit children to <listitem> elements","List component with ""group"" role has children that are not <listitem> elements","Violation","1","4.1.2","" +"aria_attribute_conflict","fail_conflict","An ARIA attribute must not conflict with the corresponding HTML attribute","The ARIA attribute ""{0}"" is in conflict with the corresponding HTML attribute ""{1}""","Violation","1","4.1.2","" +"table_aria_descendants","explicit_role","Table structure elements cannot specify an explicit 'role' within table containers","An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification","Violation","1","4.1.2","" +"aria_attribute_redundant","pass","An ARIA attribute should not be redundant with a corresponding HTML attribute","The ARIA attribute is not redundant with a corresponding HTML attribute","Pass","1","4.1.2","" +"aria_attribute_redundant","fail_redundant","An ARIA attribute should not be redundant with a corresponding HTML attribute","The ARIA attribute ""{0}"" is redundant with the HTML attribute ""{1}""","Rec","1","4.1.2","" +"aria_accessiblename_exists","fail_no_accessible_name","Elements with certain roles should have accessible names","Element <{0}> with ""{1}"" role has no accessible name","Rec | Rec","1 | 1","4.1.2 | ARIA","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"element_id_unique","Pass_0","Element 'id' attribute values must be unique within a document","Rule Passed","Pass","3","HTML","3ea0c8:pass" +"element_id_unique","Fail_1","Element 'id' attribute values must be unique within a document","The <{0}> element has the id ""{1}"" that is empty","Violation","3","HTML","3ea0c8:pass" +"element_id_unique","Fail_2","Element 'id' attribute values must be unique within a document","The <{0}> element has the id ""{1}"" that is already in use","Violation","3","HTML","3ea0c8:fail" +"element_accesskey_unique","Pass_0","'accesskey' attribute values on each element must be unique for the page","Rule Passed","Pass","3","HTML","" +"element_accesskey_unique","Fail_1","'accesskey' attribute values on each element must be unique for the page","'accesskey' attribute value on the element is not unique","Violation","3","HTML","" +"element_attribute_deprecated","pass","Avoid use of obsolete features if possible","Rule Passed","Pass","3","HTML","" +"element_attribute_deprecated","fail_elem","Avoid use of obsolete features if possible","The <{0}> element is deprecated in HTML 5","Rec","3","HTML","" +"element_attribute_deprecated","fail_attr","Avoid use of obsolete features if possible","The HTML attribute(s) ""{0}"" is deprecated in HTML 5","Rec","3","HTML","" +"element_attribute_deprecated","fail_elem_attr","Avoid use of obsolete features if possible","The HTML attribute(s) ""{0}"" is deprecated for the <{1}> element in HTML 5","Rec","3","HTML","" +"aria_attribute_valid","Pass","ARIA attributes should be valid for the element and ARIA role to which they are assigned","ARIA attributes are valid for the element and ARIA role","Pass","1","ARIA","5c01ea:pass | 46ca7f:pass" +"aria_attribute_valid","Fail_invalid_role_attr","ARIA attributes should be valid for the element and ARIA role to which they are assigned","The ARIA attributes ""{0}"" are not valid for the element <{1}> with ARIA role ""{2}""","Violation","1","ARIA","5c01ea:fail | 46ca7f:fail" +"aria_attribute_valid","Fail_invalid_implicit_role_attr","ARIA attributes should be valid for the element and ARIA role to which they are assigned","The ARIA attributes ""{0}"" are not valid for the element <{1}> with implicit ARIA role ""{2}""","Violation","1","ARIA","5c01ea:fail | 46ca7f:fail" +"img_alt_null","potential_aria_override","When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used","The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute","Violation Potential | Violation Potential","1 | 1","1.1.1 | ARIA","46ca7f:fail" +"aria_attribute_deprecated","fail_aria_role","No deprecated ARIA role or attribute should be used","The ARIA role ""{0}"" is deprecated in the ARIA specification","Rec","3","ARIA","" +"aria_attribute_deprecated","fail_aria_attr","No deprecated ARIA role or attribute should be used","The ARIA attributes ""{0}"" are deprecated in the ARIA specification","Rec","3","ARIA","" +"aria_attribute_deprecated","fail_role_attr","No deprecated ARIA role or attribute should be used","The ARIA attributes ""{0}"" are deprecated for the role ""{1}"" in the ARIA specification","Rec","3","ARIA","" +"aria_role_redundant","pass","An explicitly-assigned ARIA role should not be redundant with the implicit role of the element","An explicitly-assigned ARIA role is not redundant with the implicit role of the element","Pass","3","ARIA","" +"aria_role_redundant","fail_redundant","An explicitly-assigned ARIA role should not be redundant with the implicit role of the element","The explicitly-assigned ARIA role ""{0}"" is redundant with the implicit role of the element <{1}>","Rec","3","ARIA","" +"aria_accessiblename_exists","fail_no_accessible_name_image","Elements with certain roles should have accessible names","Element <{0}> with ""{1}"" role has no accessible name","Rec | Rec","1 | 1","4.1.2 | ARIA","23a2a8:fail" diff --git a/rule-server/src/static/archives/2024.12.12/doc/rules.html b/rule-server/src/static/archives/2024.12.12/doc/rules.html new file mode 100644 index 000000000..294f756d3 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/doc/rules.html @@ -0,0 +1,20318 @@ +<html lang="en-US"> + <head> + <title>Accessibility Checker Rules</title> + <link rel="icon" href="https://ibm.com/able/favicon-32x32.png" type="image/png"> + <link rel="icon" href="https://ibm.com/able/favicon.svg" type="image/svg+xml"> + <link rel="stylesheet" href="./common/rules.css" /> + <script type="module"> + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/code-snippet.min.js"; + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/list.min.js"; + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/content-switcher.min.js"; + </script> + <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> + <script> + function hookEvents() { + let mainSwitcher = document.getElementById("rsSwitcher"); + mainSwitcher.addEventListener("bx-content-switcher-selected", (evt) => { + let oldValue = mainSwitcher.getAttribute("value") || "IBM_Accessibility"; + let newValue = mainSwitcher.value; + document.getElementById(oldValue).style.display="none"; + document.getElementById(newValue).style.display="block"; + }) + } + </script> + <head> + <body onload="hookEvents();"> + <main> + <bx-content-switcher value="IBM_Accessibility" id="rsSwitcher"> + <bx-content-switcher-item value="IBM_Accessibility">IBM Accessibility 7.3</bx-content-switcher-item><bx-content-switcher-item value="IBM_Accessibility_next">IBM Accessibility next</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_2">WCAG 2.2 (A, AA)</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_1">WCAG 2.1 (A, AA)</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_0">WCAG 2.0 (A, AA)</bx-content-switcher-item> + </bx-content-switcher> + <div id="IBM_Accessibility" style="padding: 1rem; display:block"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_noembed_exists</strong>: &lt;embed&gt; elements should be immediately followed by a non-embedded element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_noembed_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20is%20immediately%20followed%20by%20a%20non-embedded%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element is immediately followed by a non-embedded element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_scrollable_tabbable</strong>: Scrollable elements should be tabbable or contain tabbable content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_scrollable_tabbable.html#%7B%22message%22%3A%22The%20scrollable%20element%20%3C%7B0%7D%3E%20with%20non-interactive%20content%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_scrollable%22%7D">The scrollable element &lt;{0}&gt; with non-interactive content is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_redirect_optional</strong>: Page should not automatically refresh without warning or option to turn it off or adjust the time limit + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_longrefresh%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_0%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_search_label_unique</strong>: Each element with "search" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_search_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22search%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "search" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div><div> + <h2>HTML specification [NA]</h2> + <div>The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_id_unique</strong>: Element 'id' attribute values must be unique within a document + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element has the id "{1}" that is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20already%20in%20use%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The &lt;{0}&gt; element has the id "{1}" that is already in use</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_unique</strong>: 'accesskey' attribute values on each element must be unique for the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_unique.html#%7B%22message%22%3A%22'accesskey'%20attribute%20value%20on%20the%20element%20is%20not%20unique%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">'accesskey' attribute value on the element is not unique</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_attribute_deprecated</strong>: Avoid use of obsolete features if possible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem%22%7D">The &lt;{0}&gt; element is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_attr%22%7D">The HTML attribute(s) "{0}" is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20for%20the%20%3C%7B1%7D%3E%20element%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem_attr%22%7D">The HTML attribute(s) "{0}" is deprecated for the &lt;{1}&gt; element in HTML 5</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>ARIA specification [NA]</h2> + <div>The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_attribute_valid</strong>: ARIA attributes should be valid for the element and ARIA role to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with ARIA role "{2}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20implicit%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_implicit_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with implicit ARIA role "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'aria'%20label%20is%20not%20empty%20and%20overrides%20the%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_aria_override%22%7D">The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_deprecated</strong>: No deprecated ARIA role or attribute should be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_role%22%7D">The ARIA role "{0}" is deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_attr%22%7D">The ARIA attributes "{0}" are deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20for%20the%20role%20%5C%22%7B1%7D%5C%22%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_role_attr%22%7D">The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name_image%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_redundant</strong>: An explicitly-assigned ARIA role should not be redundant with the implicit role of the element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_redundant.html#%7B%22message%22%3A%22The%20explicitly-assigned%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20implicit%20role%20of%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element &lt;{1}&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div><div id="IBM_Accessibility_next" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_noembed_exists</strong>: &lt;embed&gt; elements should be immediately followed by a non-embedded element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_noembed_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20is%20immediately%20followed%20by%20a%20non-embedded%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element is immediately followed by a non-embedded element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_scrollable_tabbable</strong>: Scrollable elements should be tabbable or contain tabbable content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_scrollable_tabbable.html#%7B%22message%22%3A%22The%20scrollable%20element%20%3C%7B0%7D%3E%20with%20non-interactive%20content%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_scrollable%22%7D">The scrollable element &lt;{0}&gt; with non-interactive content is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_redirect_optional</strong>: Page should not automatically refresh without warning or option to turn it off or adjust the time limit + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_longrefresh%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_0%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_search_label_unique</strong>: Each element with "search" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_search_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22search%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "search" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div><div> + <h2>HTML specification [NA]</h2> + <div>The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_id_unique</strong>: Element 'id' attribute values must be unique within a document + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element has the id "{1}" that is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20already%20in%20use%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The &lt;{0}&gt; element has the id "{1}" that is already in use</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_unique</strong>: 'accesskey' attribute values on each element must be unique for the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_unique.html#%7B%22message%22%3A%22'accesskey'%20attribute%20value%20on%20the%20element%20is%20not%20unique%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">'accesskey' attribute value on the element is not unique</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_attribute_deprecated</strong>: Avoid use of obsolete features if possible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem%22%7D">The &lt;{0}&gt; element is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_attr%22%7D">The HTML attribute(s) "{0}" is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20for%20the%20%3C%7B1%7D%3E%20element%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem_attr%22%7D">The HTML attribute(s) "{0}" is deprecated for the &lt;{1}&gt; element in HTML 5</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>ARIA specification [NA]</h2> + <div>The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_attribute_valid</strong>: ARIA attributes should be valid for the element and ARIA role to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with ARIA role "{2}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20implicit%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_implicit_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with implicit ARIA role "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'aria'%20label%20is%20not%20empty%20and%20overrides%20the%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_aria_override%22%7D">The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_deprecated</strong>: No deprecated ARIA role or attribute should be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_role%22%7D">The ARIA role "{0}" is deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_attr%22%7D">The ARIA attributes "{0}" are deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20for%20the%20role%20%5C%22%7B1%7D%5C%22%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_role_attr%22%7D">The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name_image%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_redundant</strong>: An explicitly-assigned ARIA role should not be redundant with the implicit role of the element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_redundant.html#%7B%22message%22%3A%22The%20explicitly-assigned%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20implicit%20role%20of%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element &lt;{1}&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div><div id="WCAG_2_2" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_noembed_exists</strong>: &lt;embed&gt; elements should be immediately followed by a non-embedded element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_noembed_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20is%20immediately%20followed%20by%20a%20non-embedded%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element is immediately followed by a non-embedded element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_scrollable_tabbable</strong>: Scrollable elements should be tabbable or contain tabbable content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_scrollable_tabbable.html#%7B%22message%22%3A%22The%20scrollable%20element%20%3C%7B0%7D%3E%20with%20non-interactive%20content%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_scrollable%22%7D">The scrollable element &lt;{0}&gt; with non-interactive content is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_redirect_optional</strong>: Page should not automatically refresh without warning or option to turn it off or adjust the time limit + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_longrefresh%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_search_label_unique</strong>: Each element with "search" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_search_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22search%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "search" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_0%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div> + </div><div id="WCAG_2_1" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_noembed_exists</strong>: &lt;embed&gt; elements should be immediately followed by a non-embedded element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_noembed_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20is%20immediately%20followed%20by%20a%20non-embedded%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element is immediately followed by a non-embedded element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_scrollable_tabbable</strong>: Scrollable elements should be tabbable or contain tabbable content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_scrollable_tabbable.html#%7B%22message%22%3A%22The%20scrollable%20element%20%3C%7B0%7D%3E%20with%20non-interactive%20content%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_scrollable%22%7D">The scrollable element &lt;{0}&gt; with non-interactive content is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_redirect_optional</strong>: Page should not automatically refresh without warning or option to turn it off or adjust the time limit + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_longrefresh%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_search_label_unique</strong>: Each element with "search" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_search_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22search%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "search" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_0%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div> + </div><div id="WCAG_2_0" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_noembed_exists</strong>: &lt;embed&gt; elements should be immediately followed by a non-embedded element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_noembed_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20is%20immediately%20followed%20by%20a%20non-embedded%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element is immediately followed by a non-embedded element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_scrollable_tabbable</strong>: Scrollable elements should be tabbable or contain tabbable content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_scrollable_tabbable.html#%7B%22message%22%3A%22The%20scrollable%20element%20%3C%7B0%7D%3E%20with%20non-interactive%20content%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_scrollable%22%7D">The scrollable element &lt;{0}&gt; with non-interactive content is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_redirect_optional</strong>: Page should not automatically refresh without warning or option to turn it off or adjust the time limit + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_redirect_optional.html#%7B%22message%22%3A%22Check%20page%20does%20not%20automatically%20refresh%20without%20warning%20or%20options%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_longrefresh%22%7D">Check page does not automatically refresh without warning or options</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_search_label_unique</strong>: Each element with "search" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_search_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22search%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "search" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_0%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div> + </main> + </body> +</html> \ No newline at end of file diff --git a/rule-server/src/static/archives/2024.12.12/js/ace-debug.js b/rule-server/src/static/archives/2024.12.12/js/ace-debug.js new file mode 100644 index 000000000..71308a09a --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/js/ace-debug.js @@ -0,0 +1,31611 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/aria/ARIADefinitions.ts": +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }), + +/***/ "./src/v2/aria/ARIAMapper.ts": +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../v4/util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../v4/util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAWalker_1 = __webpack_require__(/*! ./ARIAWalker */ "./src/v2/aria/ARIAWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../../v4/util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem_1 = node; + for (var idx = 0; idx < elem_1.attributes.length; ++idx) { + var attrInfo = elem_1.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + var applyAttrRole = function (nodeName) { + if (!(nodeName in ARIAMapper.elemAttrValueCalculators)) + return; + for (var attr in ARIAMapper.elemAttrValueCalculators[nodeName]) { + if (!(attr in retVal)) { + var value = ARIAMapper.elemAttrValueCalculators[nodeName][attr]; + if (typeof value != "undefined" && value !== null) { + if (typeof value !== typeof "") { + value = value(elem_1); + } + retVal[attr] = value; + } + } + } + }; + applyAttrRole("global"); + applyAttrRole(node.nodeName.toLowerCase()); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + for (var attr in ARIAMapper.textAttrValueCalculators) { + var val = ARIAMapper.textAttrValueCalculators[attr](node); + if (typeof val != "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + for (var iId = 0; iId < ownIds.length; ++iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || "none", + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || "none"), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_1 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_1) { + parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_1 && parent_1.nodeType !== 1) { + parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === "none" || parentInfo.role === "/none") { + parent_1 = ARIAMapper.getAriaOwnedBy(parent_1) || DOMWalker_1.DOMWalker.parentElement(parent_1); + parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || "none", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = "none"; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== "none") { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = this.hierarchyResults[idx].role.substring(1); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== "none") { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_2 ? CacheUtil_1.CacheUtil.getCache(parent_2, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": AccNameUtil_1.AccNameUtil.computeAccessibleName //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + if (elem.getAttribute("type") === "checkbox" || elem.getAttribute("type") === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = parent.querySelectorAll("li"); + var otherlis = parent.querySelectorAll("ol li, ul li, menu li"); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = parent.querySelectorAll("li"); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }), + +/***/ "./src/v2/aria/ARIAWalker.ts": +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAWalker.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ./ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts": +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/fragment.ts": +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/lang.ts": +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }), + +/***/ "./src/v2/common/CommonMapper.ts": +/*!***************************************!*\ + !*** ./src/v2/common/CommonMapper.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || "none"; + this.hierarchyRole.push(role); + if (role !== "none") { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== "none") { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }), + +/***/ "./src/v2/common/Context.ts": +/*!**********************************!*\ + !*** ./src/v2/common/Context.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }), + +/***/ "./src/v2/common/Engine.ts": +/*!*********************************!*\ + !*** ./src/v2/common/Engine.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var Context_1 = __webpack_require__(/*! ./Context */ "./src/v2/common/Context.ts"); +var Config_1 = __webpack_require__(/*! ../config/Config */ "./src/v2/config/Config.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../../v4/api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + do { + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }), + +/***/ "./src/v2/config/Config.ts": +/*!*********************************!*\ + !*** ./src/v2/config/Config.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }), + +/***/ "./src/v2/dom/DOMMapper.ts": +/*!*********************************!*\ + !*** ./src/v2/dom/DOMMapper.ts ***! + \*********************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var bunds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (bunds === undefined) { + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + } + return bunds; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var bunds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (bunds === undefined) { + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + } + return bunds; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }), + +/***/ "./src/v2/dom/DOMUtil.ts": +/*!*******************************!*\ + !*** ./src/v2/dom/DOMUtil.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ./DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + // return true if element1 and element2 (cells) are in the same table + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Copies objects, but retains Node attributes as references + * @param rhs + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }), + +/***/ "./src/v2/dom/DOMWalker.ts": +/*!*********************************!*\ + !*** ./src/v2/dom/DOMWalker.ts ***! + \*********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }), + +/***/ "./src/v2/style/StyleMapper.ts": +/*!*************************************!*\ + !*** ./src/v2/style/StyleMapper.ts ***! + \*************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StyleMapper = void 0; +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var StyleMapper = /** @class */ (function (_super) { + __extends(StyleMapper, _super); + function StyleMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + StyleMapper.prototype.getRole = function (node) { + return "computed"; + }; + StyleMapper.prototype.getNamespace = function () { + return "css"; + }; + StyleMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + var style = elem.ownerDocument.defaultView.getComputedStyle(elem); + for (var idx = 0; idx < style.length; ++idx) { + var name_1 = style[idx].toLowerCase(); + retVal[name_1] = style[name_1]; + } + } + return retVal; + }; + return StyleMapper; +}(CommonMapper_1.CommonMapper)); +exports.StyleMapper = StyleMapper; + + +/***/ }), + +/***/ "./src/v4/api/IGuideline.ts": +/*!**********************************!*\ + !*** ./src/v4/api/IGuideline.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }), + +/***/ "./src/v4/api/IRule.ts": +/*!*****************************!*\ + !*** ./src/v4/api/IRule.ts ***! + \*****************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }), + +/***/ "./src/v4/checker/Checker.ts": +/*!***********************************!*\ + !*** ./src/v4/checker/Checker.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var Engine_1 = __webpack_require__(/*! ../../v2/common/Engine */ "./src/v2/common/Engine.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var StyleMapper_1 = __webpack_require__(/*! ../../v2/style/StyleMapper */ "./src/v2/style/StyleMapper.ts"); +var rulesets_1 = __webpack_require__(/*! ../rulesets */ "./src/v4/rulesets.ts"); +var checkRulesV4 = __webpack_require__(/*! ../rules */ "./src/v4/rules/index.ts"); +var IGuideline_1 = __webpack_require__(/*! ../api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addMapper(new StyleMapper_1.StyleMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }), + +/***/ "./src/v4/rules/a_target_warning.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/a_target_warning.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/a_text_purpose.ts": +/*!****************************************!*\ + !*** ./src/v4/rules/a_text_purpose.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/applet_alt_exists.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/applet_alt_exists.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/application_content_accessible.ts": +/*!********************************************************!*\ + !*** ./src/v4/rules/application_content_accessible.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/area_alt_exists.ts": +/*!*****************************************!*\ + !*** ./src/v4/rules/area_alt_exists.ts ***! + \*****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_accessiblename_exists.ts": +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_accessiblename_exists.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:form, aria:heading, aria:rowheader, aria:table, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts": +/*!**************************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_tabindex_valid.ts ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_activedescendant_valid.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_valid.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_application_label_unique.ts": +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_application_label_unique.ts ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_application_label_unique.html", + "Fail_1": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "application", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_application_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_application_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_application_labelled.ts": +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_application_labelled.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_application_labelled.html", + "Fail_1": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_article_label_unique.ts": +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_article_label_unique.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_article_label_unique.html", + "Fail_1": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "article", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_article_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_article_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1; + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_attribute_allowed.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/aria_attribute_allowed.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_attribute_conflict.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_conflict.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_attribute_deprecated.ts": +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_attribute_deprecated.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_attribute_exists.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_attribute_exists.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_attribute_redundant.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_attribute_redundant.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_attribute_required.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_required.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_attribute_value_valid.ts": +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_attribute_value_valid.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_banner_label_unique.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_banner_label_unique.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_label_unique.html", + "Fail_1": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "banner", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_banner_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_banner_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_banner_single.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/aria_banner_single.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_child_tabbable.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_child_tabbable.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + // Determine if this is referenced by a combobox. If so, focus is controlled by the combobox + // ignore if the id of the element is referenced by another element with "aria-controls" or "aria-expanded" and with certain roles. If so, focus is controlled by the referencing element + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + /**if (ruleContext.ownerDocument.querySelector(`*[aria-controls='${id}'][role='combobox']`)) { + return null; + } + */ + var elem = ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][aria-haspopup='true'], *[aria-controls='").concat(id, "'][aria-expanded='true']")); + var containers_1 = ['combobox', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (elem && CommonUtil_1.CommonUtil.isTabbable(elem) && roles && roles.length > 0 && roles.some(function (r) { return containers_1.includes(r); })) + return null; + } + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + for (var j = 0; j < roles.length; ++j) { + if (ARIADefinitions_1.ARIADefinitions.containers.includes(roles[j])) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_child_valid.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/aria_child_valid.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_complementary_label_unique.ts": +/*!*********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_unique.ts ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_unique.html", + "Fail_1": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "complementary", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_complementary_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_complementary_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_complementary_label_visible.ts": +/*!**********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_visible.ts ***! + \**********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_complementary_labelled.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_complementary_labelled.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_content_in_landmark.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_content_in_landmark.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_contentinfo_label_unique.ts": +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_label_unique.ts ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_label_unique.html", + "Fail_1": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "contentinfo", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_contentinfo_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_contentinfo_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_contentinfo_misuse.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_misuse.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_contentinfo_single.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_single.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_descendant_valid.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_descendant_valid.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + var tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + explicitRoles.push(childRoles.join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_document_label_unique.ts": +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_document_label_unique.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_document_label_unique.html", + "Fail_1": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "document", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_document_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_document_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1; + // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_eventhandler_role_valid.ts": +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_eventhandler_role_valid.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_form_label_unique.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/aria_form_label_unique.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_form_label_unique.html", + "Fail_1": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + // form element should only be considered if it has an aria label or title + if (ruleContext.getAttribute("role") === "form" || + ruleContext.hasAttribute("aria-label") || + ruleContext.hasAttribute("aria-labelledby") || + ruleContext.hasAttribute("title")) { + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "form", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_form_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_form_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && + (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_graphic_labelled.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_graphic_labelled.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_hidden_nontabbable.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_hidden_nontabbable.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_id_unique.ts": +/*!****************************************!*\ + !*** ./src/v4/rules/aria_id_unique.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_img_labelled.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_img_labelled.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_keyboard_handler_exists.ts": +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_keyboard_handler_exists.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_landmark_name_unique.ts": +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_landmark_name_unique.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "Pass_0", + "Fail_0": "Fail_0" + } + }, + help: { + "en-US": { + "Pass_0": "aria_landmark_name_unique.html", + "Fail_0": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "Fail_0": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(function (elem) { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null; // Skipping checking landmarks that happen to be inside dialog elements + } + } + }); + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + var a = navigationNodes[i]; + var dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("Fail_0"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("Fail_0"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("Pass_0"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "Pass_0") { + return (0, IRule_1.RulePass)("Pass_0", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "Fail_0") { + return (0, IRule_1.RuleFail)("Fail_0", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_main_label_unique.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/aria_main_label_unique.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_main_label_visible.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_main_label_visible.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_navigation_label_unique.ts": +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_navigation_label_unique.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_navigation_label_unique.html", + "Fail_1": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "navigation", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_navigation_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_navigation_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_parent_required.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_parent_required.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_region_label_unique.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_region_label_unique.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_label_unique.html", + "Fail_1": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + // form element should only be considered if it has an aria label or title + if (ruleContext.getAttribute("role") === "region" || + ruleContext.hasAttribute("aria-label") || + (ruleContext.hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, ruleContext.getAttribute("aria-labelledby"))) || + ruleContext.hasAttribute("title")) { + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "region", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_region_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_region_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && + (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_region_labelled.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_region_labelled.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_role_allowed.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_role_allowed.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_role_redundant.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_role_redundant.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + if (["td", "th", "tr"].includes(elemName)) { + var parentRole = TableUtil_1.TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_search_label_unique.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_search_label_unique.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_search_label_unique.html", + "Fail_1": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "search", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_search_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_search_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_semantics.ts": +/*!****************************************!*\ + !*** ./src/v4/rules/aria_semantics.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_toolbar_label_unique.ts": +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_toolbar_label_unique.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/aria_widget_labelled.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_widget_labelled.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/asciiart_alt_exists.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/asciiart_alt_exists.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/blink_css_review.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/blink_css_review.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/blink_elem_deprecated.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/blink_elem_deprecated.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/blockquote_cite_exists.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/blockquote_cite_exists.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/canvas_content_described.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/canvas_content_described.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/caption_track_exists.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/caption_track_exists.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/combobox_active_descendant.ts": +/*!****************************************************!*\ + !*** ./src/v4/rules/combobox_active_descendant.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + //let nw = new NodeWalker(popupElement); + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/combobox_autocomplete_valid.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_autocomplete_valid.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + //let nw = new NodeWalker(popupElement); + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/combobox_design_valid.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/combobox_design_valid.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/combobox_focusable_elements.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_focusable_elements.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + //let nw = new NodeWalker(popupElement); + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/combobox_haspopup_valid.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/combobox_haspopup_valid.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/combobox_popup_reference.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/combobox_popup_reference.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/debug_paths.ts": +/*!*************************************!*\ + !*** ./src/v4/rules/debug_paths.ts ***! + \*************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/detector_tabbable.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/detector_tabbable.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/dir_attribute_valid.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/dir_attribute_valid.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/download_keyboard_controllable.ts": +/*!********************************************************!*\ + !*** ./src/v4/rules/download_keyboard_controllable.ts ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/draggable_alternative_exists.ts": +/*!******************************************************!*\ + !*** ./src/v4/rules/draggable_alternative_exists.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_accesskey_labelled.ts": +/*!****************************************************!*\ + !*** ./src/v4/rules/element_accesskey_labelled.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_accesskey_unique.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/element_accesskey_unique.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_attribute_deprecated.ts": +/*!******************************************************!*\ + !*** ./src/v4/rules/element_attribute_deprecated.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_id_unique.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/element_id_unique.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "Pass_0": "element_id_unique.html", + "Fail_1": "element_id_unique.html", + "Fail_2": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element has the id \"{1}\" that is empty", + "Fail_2": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RuleFail)("Fail_1", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_lang_valid.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/element_lang_valid.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_mouseevent_keyboard.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_mouseevent_keyboard.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_orientation_unlocked.ts": +/*!******************************************************!*\ + !*** ./src/v4/rules/element_orientation_unlocked.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // When degree is 1 turn (360 degree), it is not considered an orientation lock + // allow 1 degree floating range for the right angle + if (Math.abs(degree - 360) % 360 > 1) + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + else + ret.push((0, IRule_1.RulePass)("pass")); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_scrollable_tabbable.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_scrollable_tabbable.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ..//util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styles = getComputedStyle(ruleContext); + // not scrollable, inapplicable + if ((styles.overflowX === 'visible' || styles.overflowX === 'hidden') + && (styles.overflowY === 'visible' || styles.overflowY === 'hidden')) + return null; + // ignore if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(ruleContext.offsetWidth, ruleContext.offsetHeight) < 30 || Math.min(ruleContext.offsetWidth, ruleContext.offsetHeight) < 15) + return null; + // ignore if both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, ruleContext) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, ruleContext); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, ruleContext) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, ruleContext); + if (ruleContext.scrollWidth - ruleContext.clientWidth < 1 + padding_x + && ruleContext.scrollHeight - ruleContext.clientHeight < 1 + padding_y) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [nodeName]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_tabbable_role_valid.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_role_valid.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore elements with CSS overflow: scroll or auto + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); + if (styles['overflow-x'] === 'scroll' || styles['overflow-y'] === 'scroll' + || styles['overflow-x'] === 'auto' || styles['overflow-y'] === 'auto') + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_tabbable_unobscured.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_unobscured.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + ; + //in case the bounds not available + if (!bounds) + return null; + //ignore if offscreen + if (bounds['height'] === 0 || bounds['width'] === 0) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var cStyle = win.getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || zindex === 'auto') + zindex = "0"; + var elems = doc.querySelectorAll('body *:not(script)'); + if (!elems || elems.length == 0) + return; + var violations = []; + var before = true; + elems.forEach(function (elem) { + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + */ + if (ruleContext.contains(elem)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + } + else if (VisUtil_1.VisUtil.isNodeVisible(elem) && !elem.contains(ruleContext)) { + var bnds = mapper.getUnadjustedBounds(elem); + var zStyle = win.getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + if (bnds.height !== 0 && bnds.width !== 0 + && bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.height >= bounds.left + bounds.width + && (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index))) { + violations.push(elem); + } + } + }); + if (violations.length > 0) { + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/element_tabbable_visible.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/element_tabbable_visible.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // defined styles only give the styles that changed + var defined_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); + var onfocus_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus"); + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + var focus_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus"); + var focus_visible_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus-visible"); + var focus_within_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus-within"); + var checked_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":checked"); + if (focus_styles || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/embed_alt_exists.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/embed_alt_exists.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/embed_noembed_exists.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/embed_noembed_exists.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_noembed_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.embed_noembed_exists = { + id: "embed_noembed_exists", + context: "dom:embed", + refactor: { + "WCAG20_Embed_HasNoEmbed": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_noembed_exists.html", + "Potential_1": "embed_noembed_exists.html", + "group": "embed_noembed_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element is immediately followed by a non-embedded element", + "group": "<embed> elements should be immediately followed by a non-embedded element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getElementsByTagName("noembed").length > 0; + if (!passed) { + var walkNode = ruleContext.nextSibling; + while (!passed && walkNode !== null) { + if (walkNode.nodeName.toLowerCase() == "noembed") + passed = true; + else if (walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + break; + else if (walkNode.nodeType == 1) + break; + walkNode = walkNode.nextSibling; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/emoticons_alt_exists.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/emoticons_alt_exists.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/error_message_exists.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/error_message_exists.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/fieldset_label_valid.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/fieldset_label_valid.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/fieldset_legend_valid.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/fieldset_legend_valid.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/figure_label_exists.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/figure_label_exists.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/form_font_color.ts": +/*!*****************************************!*\ + !*** ./src/v4/rules/form_font_color.ts ***! + \*****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/form_interaction_review.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/form_interaction_review.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/form_label_unique.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/form_label_unique.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/form_submit_button_exists.ts": +/*!***************************************************!*\ + !*** ./src/v4/rules/form_submit_button_exists.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + //let nw = new NodeWalker(ruleContext, true); + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/form_submit_review.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/form_submit_review.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/frame_src_valid.ts": +/*!*****************************************!*\ + !*** ./src/v4/rules/frame_src_valid.ts ***! + \*****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/frame_title_exists.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/frame_title_exists.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/heading_content_exists.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/heading_content_exists.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/heading_markup_misuse.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/heading_markup_misuse.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/html_lang_exists.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/html_lang_exists.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/html_skipnav_exists.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/html_skipnav_exists.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/iframe_interactive_tabbable.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/iframe_interactive_tabbable.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/imagebutton_alt_exists.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/imagebutton_alt_exists.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/imagemap_alt_exists.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/imagemap_alt_exists.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/img_alt_background.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_background.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/img_alt_decorative.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_decorative.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/img_alt_misuse.ts": +/*!****************************************!*\ + !*** ./src/v4/rules/img_alt_misuse.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/img_alt_null.ts": +/*!**************************************!*\ + !*** ./src/v4/rules/img_alt_null.ts ***! + \**************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/img_alt_redundant.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/img_alt_redundant.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + //let walk = new NodeWalker(aNode); + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + //walk = new NodeWalker(aNode, true); + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/img_alt_valid.ts": +/*!***************************************!*\ + !*** ./src/v4/rules/img_alt_valid.ts ***! + \***************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, ignore + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/img_ismap_misuse.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/img_ismap_misuse.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/img_longdesc_misuse.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/img_longdesc_misuse.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/index.ts": +/*!*******************************!*\ + !*** ./src/v4/rules/index.ts ***! + \*******************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(/*! ./a_target_warning */ "./src/v4/rules/a_target_warning.ts"), exports); +__exportStar(__webpack_require__(/*! ./a_text_purpose */ "./src/v4/rules/a_text_purpose.ts"), exports); +__exportStar(__webpack_require__(/*! ./applet_alt_exists */ "./src/v4/rules/applet_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./application_content_accessible */ "./src/v4/rules/application_content_accessible.ts"), exports); +__exportStar(__webpack_require__(/*! ./area_alt_exists */ "./src/v4/rules/area_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_accessiblename_exists */ "./src/v4/rules/aria_accessiblename_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_tabindex_valid */ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_valid */ "./src/v4/rules/aria_activedescendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_label_unique */ "./src/v4/rules/aria_application_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_labelled */ "./src/v4/rules/aria_application_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_article_label_unique */ "./src/v4/rules/aria_article_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_allowed */ "./src/v4/rules/aria_attribute_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_conflict */ "./src/v4/rules/aria_attribute_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_deprecated */ "./src/v4/rules/aria_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_exists */ "./src/v4/rules/aria_attribute_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_redundant */ "./src/v4/rules/aria_attribute_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_required */ "./src/v4/rules/aria_attribute_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_value_valid */ "./src/v4/rules/aria_attribute_value_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_label_unique */ "./src/v4/rules/aria_banner_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_single */ "./src/v4/rules/aria_banner_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_tabbable */ "./src/v4/rules/aria_child_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_valid */ "./src/v4/rules/aria_child_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_unique */ "./src/v4/rules/aria_complementary_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_visible */ "./src/v4/rules/aria_complementary_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_labelled */ "./src/v4/rules/aria_complementary_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_content_in_landmark */ "./src/v4/rules/aria_content_in_landmark.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_label_unique */ "./src/v4/rules/aria_contentinfo_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_misuse */ "./src/v4/rules/aria_contentinfo_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_single */ "./src/v4/rules/aria_contentinfo_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_descendant_valid */ "./src/v4/rules/aria_descendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_document_label_unique */ "./src/v4/rules/aria_document_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_eventhandler_role_valid */ "./src/v4/rules/aria_eventhandler_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_form_label_unique */ "./src/v4/rules/aria_form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_graphic_labelled */ "./src/v4/rules/aria_graphic_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_hidden_nontabbable */ "./src/v4/rules/aria_hidden_nontabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_id_unique */ "./src/v4/rules/aria_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_img_labelled */ "./src/v4/rules/aria_img_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_keyboard_handler_exists */ "./src/v4/rules/aria_keyboard_handler_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_landmark_name_unique */ "./src/v4/rules/aria_landmark_name_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_unique */ "./src/v4/rules/aria_main_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_visible */ "./src/v4/rules/aria_main_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_navigation_label_unique */ "./src/v4/rules/aria_navigation_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_parent_required */ "./src/v4/rules/aria_parent_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_label_unique */ "./src/v4/rules/aria_region_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_labelled */ "./src/v4/rules/aria_region_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_allowed */ "./src/v4/rules/aria_role_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_redundant */ "./src/v4/rules/aria_role_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_search_label_unique */ "./src/v4/rules/aria_search_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_semantics */ "./src/v4/rules/aria_semantics.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_toolbar_label_unique */ "./src/v4/rules/aria_toolbar_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_widget_labelled */ "./src/v4/rules/aria_widget_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./asciiart_alt_exists */ "./src/v4/rules/asciiart_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_css_review */ "./src/v4/rules/blink_css_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_elem_deprecated */ "./src/v4/rules/blink_elem_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./blockquote_cite_exists */ "./src/v4/rules/blockquote_cite_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./canvas_content_described */ "./src/v4/rules/canvas_content_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./caption_track_exists */ "./src/v4/rules/caption_track_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_active_descendant */ "./src/v4/rules/combobox_active_descendant.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_autocomplete_valid */ "./src/v4/rules/combobox_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_design_valid */ "./src/v4/rules/combobox_design_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_focusable_elements */ "./src/v4/rules/combobox_focusable_elements.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_haspopup_valid */ "./src/v4/rules/combobox_haspopup_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_popup_reference */ "./src/v4/rules/combobox_popup_reference.ts"), exports); +__exportStar(__webpack_require__(/*! ./debug_paths */ "./src/v4/rules/debug_paths.ts"), exports); +__exportStar(__webpack_require__(/*! ./detector_tabbable */ "./src/v4/rules/detector_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./dir_attribute_valid */ "./src/v4/rules/dir_attribute_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./download_keyboard_controllable */ "./src/v4/rules/download_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./draggable_alternative_exists */ "./src/v4/rules/draggable_alternative_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_labelled */ "./src/v4/rules/element_accesskey_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_unique */ "./src/v4/rules/element_accesskey_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_attribute_deprecated */ "./src/v4/rules/element_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_id_unique */ "./src/v4/rules/element_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_lang_valid */ "./src/v4/rules/element_lang_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_mouseevent_keyboard */ "./src/v4/rules/element_mouseevent_keyboard.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_orientation_unlocked */ "./src/v4/rules/element_orientation_unlocked.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_scrollable_tabbable */ "./src/v4/rules/element_scrollable_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_role_valid */ "./src/v4/rules/element_tabbable_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_unobscured */ "./src/v4/rules/element_tabbable_unobscured.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_visible */ "./src/v4/rules/element_tabbable_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./embed_alt_exists */ "./src/v4/rules/embed_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./embed_noembed_exists */ "./src/v4/rules/embed_noembed_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./emoticons_alt_exists */ "./src/v4/rules/emoticons_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./error_message_exists */ "./src/v4/rules/error_message_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_label_valid */ "./src/v4/rules/fieldset_label_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_legend_valid */ "./src/v4/rules/fieldset_legend_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./figure_label_exists */ "./src/v4/rules/figure_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_font_color */ "./src/v4/rules/form_font_color.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_interaction_review */ "./src/v4/rules/form_interaction_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_label_unique */ "./src/v4/rules/form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_button_exists */ "./src/v4/rules/form_submit_button_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_review */ "./src/v4/rules/form_submit_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_src_valid */ "./src/v4/rules/frame_src_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_title_exists */ "./src/v4/rules/frame_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_content_exists */ "./src/v4/rules/heading_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_markup_misuse */ "./src/v4/rules/heading_markup_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_lang_exists */ "./src/v4/rules/html_lang_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_skipnav_exists */ "./src/v4/rules/html_skipnav_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./iframe_interactive_tabbable */ "./src/v4/rules/iframe_interactive_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagebutton_alt_exists */ "./src/v4/rules/imagebutton_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagemap_alt_exists */ "./src/v4/rules/imagemap_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_background */ "./src/v4/rules/img_alt_background.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_decorative */ "./src/v4/rules/img_alt_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_misuse */ "./src/v4/rules/img_alt_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_null */ "./src/v4/rules/img_alt_null.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_redundant */ "./src/v4/rules/img_alt_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_valid */ "./src/v4/rules/img_alt_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_ismap_misuse */ "./src/v4/rules/img_ismap_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_longdesc_misuse */ "./src/v4/rules/img_longdesc_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_autocomplete_valid */ "./src/v4/rules/input_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_checkboxes_grouped */ "./src/v4/rules/input_checkboxes_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_fields_grouped */ "./src/v4/rules/input_fields_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_haspopup_conflict */ "./src/v4/rules/input_haspopup_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_after */ "./src/v4/rules/input_label_after.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_before */ "./src/v4/rules/input_label_before.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_exists */ "./src/v4/rules/input_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_visible */ "./src/v4/rules/input_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_onchange_review */ "./src/v4/rules/input_onchange_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_placeholder_label_visible */ "./src/v4/rules/input_placeholder_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_content_exists */ "./src/v4/rules/label_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_name_visible */ "./src/v4/rules/label_name_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_ref_valid */ "./src/v4/rules/label_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_children_valid */ "./src/v4/rules/list_children_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_markup_review */ "./src/v4/rules/list_markup_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_structure_proper */ "./src/v4/rules/list_structure_proper.ts"), exports); +__exportStar(__webpack_require__(/*! ./marquee_elem_avoid */ "./src/v4/rules/marquee_elem_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_brief */ "./src/v4/rules/media_alt_brief.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_exists */ "./src/v4/rules/media_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_audio_transcribed */ "./src/v4/rules/media_audio_transcribed.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_autostart_controllable */ "./src/v4/rules/media_autostart_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_keyboard_controllable */ "./src/v4/rules/media_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_live_captioned */ "./src/v4/rules/media_live_captioned.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_track_available */ "./src/v4/rules/media_track_available.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_redirect_optional */ "./src/v4/rules/meta_redirect_optional.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_refresh_delay */ "./src/v4/rules/meta_refresh_delay.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_viewport_zoomable */ "./src/v4/rules/meta_viewport_zoomable.ts"), exports); +__exportStar(__webpack_require__(/*! ./noembed_content_exists */ "./src/v4/rules/noembed_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./object_text_exists */ "./src/v4/rules/object_text_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_exists */ "./src/v4/rules/page_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_valid */ "./src/v4/rules/page_title_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_focus_blur_review */ "./src/v4/rules/script_focus_blur_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_avoid */ "./src/v4/rules/script_onclick_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_misuse */ "./src/v4/rules/script_onclick_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_select_review */ "./src/v4/rules/script_select_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./select_options_grouped */ "./src/v4/rules/select_options_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_described */ "./src/v4/rules/skip_main_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_exists */ "./src/v4/rules/skip_main_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_background_decorative */ "./src/v4/rules/style_background_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_before_after_review */ "./src/v4/rules/style_before_after_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_color_misuse */ "./src/v4/rules/style_color_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_focus_visible */ "./src/v4/rules/style_focus_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_highcontrast_visible */ "./src/v4/rules/style_highcontrast_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_hover_persistent */ "./src/v4/rules/style_hover_persistent.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_viewport_resizable */ "./src/v4/rules/style_viewport_resizable.ts"), exports); +__exportStar(__webpack_require__(/*! ./svg_graphics_labelled */ "./src/v4/rules/svg_graphics_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_aria_descendants */ "./src/v4/rules/table_aria_descendants.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_empty */ "./src/v4/rules/table_caption_empty.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_nested */ "./src/v4/rules/table_caption_nested.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_exists */ "./src/v4/rules/table_headers_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_ref_valid */ "./src/v4/rules/table_headers_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_related */ "./src/v4/rules/table_headers_related.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_layout_linearized */ "./src/v4/rules/table_layout_linearized.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_scope_valid */ "./src/v4/rules/table_scope_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_structure_misuse */ "./src/v4/rules/table_structure_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_summary_redundant */ "./src/v4/rules/table_summary_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./target_spacing_sufficient */ "./src/v4/rules/target_spacing_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_block_heading */ "./src/v4/rules/text_block_heading.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_contrast_sufficient */ "./src/v4/rules/text_contrast_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_quoted_correctly */ "./src/v4/rules/text_quoted_correctly.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_sensory_misuse */ "./src/v4/rules/text_sensory_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_spacing_valid */ "./src/v4/rules/text_spacing_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_whitespace_valid */ "./src/v4/rules/text_whitespace_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_exists */ "./src/v4/rules/widget_tabbable_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_single */ "./src/v4/rules/widget_tabbable_single.ts"), exports); + + +/***/ }), + +/***/ "./src/v4/rules/input_autocomplete_valid.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/input_autocomplete_valid.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_checkboxes_grouped.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/input_checkboxes_grouped.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_fields_grouped.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/input_fields_grouped.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_haspopup_conflict.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/input_haspopup_conflict.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_label_after.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/input_label_after.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + //let walkNode = new NodeWalker(labelElem); + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_label_before.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_before.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_label_exists.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_exists.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_label_visible.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/input_label_visible.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + /** + if (CommonUtil.hasImplicitLabel(ruleContext)) + return RulePass("pass"); + + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + return RulePass("pass"); + + // special cases + let type = ruleContext.getAttribute("type"); + if (nodeName === 'input' && type) { + type = type.toLowerCase(); + //submit type of input has a visible label 'Submit' by default + if (type === 'submit' || type === 'reset') + return RulePass("pass"); + //image type of input requires a non-empty alt text + if (type === 'image' && CommonUtil.attributeNonEmpty(ruleContext, "alt")) + return RulePass("pass"); + } + */ + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + // and (3) an alternative tooltip exists that can be made visible through mouseover + /**if (!CommonUtil.isInnerTextEmpty(ruleContext)) + return RulePass("pass"); + + // check if an alternative tooltip exists that can be made visible through mouseover + if (CommonUtil.attributeNonEmpty(ruleContext, "title")) + return RulePass("pass"); + */ + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + /**if (nodeName === "optgroup" && CommonUtil.attributeNonEmpty(ruleContext, "label")) + return RulePass("pass"); + + if (nodeName == "option" && (CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0)) + return RulePass("pass"); + */ + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_onchange_review.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/input_onchange_review.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/input_placeholder_label_visible.ts": +/*!*********************************************************!*\ + !*** ./src/v4/rules/input_placeholder_label_visible.ts ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/label_content_exists.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/label_content_exists.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/label_name_visible.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/label_name_visible.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/label_ref_valid.ts": +/*!*****************************************!*\ + !*** ./src/v4/rules/label_ref_valid.ts ***! + \*****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/list_children_valid.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/list_children_valid.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/list_markup_review.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/list_markup_review.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + // "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + // "pass": "list_markup_review.html", + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + // "pass": "Proper HTML elements are used to create a list", + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", 'label']) !== null) + return null; + // ignore all widgets and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "columnheader", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something changes, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + var failure = /^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(txtVal); + passed = !failure; + if (!passed) { + // Ensure that there's some sort of block level element before this + // Avoid failures due to things like <i>Some sentence</i>. New sentence. + //let nw = new NodeWalker(walkNode); + var nw = new DOMWalker_1.DOMWalker(walkNode); + while (!passed && nw.prevNode()) { + var nodeName_1 = nw.node.nodeName.toLowerCase(); + if (["blockquote", "center", "dir", "div", "form", "h1", + "h2", "h3", "h4", "h5", "h6", "hr", "br", "menu", "p", + "pre"].includes(nodeName_1)) { + break; + } + if (nodeName_1 == "#text") { + var txt = nw.node.nodeValue; + passed = txt.length > 0 && ![" ", "\t", "\n"].includes(txt.charAt(txt.length - 1)); + } + } + } + } + walkNode = walkNode.nextSibling; + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("potential_list"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/list_structure_proper.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/list_structure_proper.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/marquee_elem_avoid.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/marquee_elem_avoid.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/media_alt_brief.ts": +/*!*****************************************!*\ + !*** ./src/v4/rules/media_alt_brief.ts ***! + \*****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/media_alt_exists.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/media_alt_exists.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/media_audio_transcribed.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/media_audio_transcribed.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/media_autostart_controllable.ts": +/*!******************************************************!*\ + !*** ./src/v4/rules/media_autostart_controllable.ts ***! + \******************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/media_keyboard_controllable.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/media_keyboard_controllable.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/media_live_captioned.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/media_live_captioned.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/media_track_available.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/media_track_available.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/meta_redirect_optional.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/meta_redirect_optional.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + act: [{ + "bc659a": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var content = ruleContext.getAttribute("content").toLowerCase(); + // Invalid content field + if (!content.match(/^\d+$/) && !content.match(/^\d+;/)) { + return null; + } + // Only check the first one since it takes priority + if (CommonUtil_1.CommonUtil.triggerOnce(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "meta_redirect_optional", false)) { + return null; + } + var timeMatch = content.match(/^(\d+); +[^ ]/); + if (!timeMatch || parseInt(timeMatch[1]) === 0) { + return (0, IRule_1.RulePass)("pass"); + } + else { + var time = parseInt(timeMatch[1]); + if (time < 72001) { + return (0, IRule_1.RuleFail)("fail"); + } + else { + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/meta_refresh_delay.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/meta_refresh_delay.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "Pass_0": "meta_refresh_delay.html", + "Potential_1": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "Pass_0": "Rule Passed", + "Potential_1": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: ["bisz58", "bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // Invalid content field + if (!content.match(/^\d+$/) && !content.match(/^\d+;/)) { + return null; + } + var fail = !content.match(/^\d+; +[^ ]/); + return !fail ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/meta_viewport_zoomable.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/meta_viewport_zoomable.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "Pass_0": "pass", + "Potential_1": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/noembed_content_exists.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/noembed_content_exists.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/object_text_exists.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/object_text_exists.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/page_title_exists.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/page_title_exists.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/page_title_valid.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/page_title_valid.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/script_focus_blur_review.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/script_focus_blur_review.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/script_onclick_avoid.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/script_onclick_avoid.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/script_onclick_misuse.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/script_onclick_misuse.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/script_select_review.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/script_select_review.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/select_options_grouped.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/select_options_grouped.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/skip_main_described.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/skip_main_described.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/skip_main_exists.ts": +/*!******************************************!*\ + !*** ./src/v4/rules/skip_main_exists.ts ***! + \******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/style_background_decorative.ts": +/*!*****************************************************!*\ + !*** ./src/v4/rules/style_background_decorative.ts ***! + \*****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/style_before_after_review.ts": +/*!***************************************************!*\ + !*** ./src/v4/rules/style_before_after_review.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/style_color_misuse.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/style_color_misuse.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + //let nw = new NodeWalker(ruleContext); + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/style_focus_visible.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/style_focus_visible.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + var normalStyles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); // consider noth user-defined and browser default + var focusStyles = []; + focusStyles.push(CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus")); + focusStyles.push(CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus-visible")); + focusStyles.push(CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus-within")); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/style_highcontrast_visible.ts": +/*!****************************************************!*\ + !*** ./src/v4/rules/style_highcontrast_visible.ts ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/style_hover_persistent.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/style_hover_persistent.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/style_viewport_resizable.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/style_viewport_resizable.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/svg_graphics_labelled.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/svg_graphics_labelled.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_aria_descendants.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/table_aria_descendants.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_caption_empty.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/table_caption_empty.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_caption_nested.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/table_caption_nested.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_headers_exists.ts": +/*!**********************************************!*\ + !*** ./src/v4/rules/table_headers_exists.ts ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_headers_ref_valid.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/table_headers_ref_valid.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_headers_related.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/table_headers_related.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_layout_linearized.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/table_layout_linearized.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_scope_valid.ts": +/*!*******************************************!*\ + !*** ./src/v4/rules/table_scope_valid.ts ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_structure_misuse.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/table_structure_misuse.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/table_summary_redundant.ts": +/*!*************************************************!*\ + !*** ./src/v4/rules/table_summary_redundant.ts ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/target_spacing_sufficient.ts": +/*!***************************************************!*\ + !*** ./src/v4/rules/target_spacing_sufficient.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + if (!elems || elems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = elems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + if (ruleContext.contains(elem)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // ignore ascendants of the element, not a target, or itself or its ascendant already checked + if (elem.contains(ruleContext) || !CommonUtil_1.CommonUtil.isTarget(elem) + || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + var zStyle; + for (var i = 0; i < elems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/text_block_heading.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/text_block_heading.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + //let nw = new NodeWalker(ruleContext); + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/text_contrast_sufficient.ts": +/*!**************************************************!*\ + !*** ./src/v4/rules/text_contrast_sufficient.ts ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + ; + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + ; + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/text_quoted_correctly.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/text_quoted_correctly.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/text_sensory_misuse.ts": +/*!*********************************************!*\ + !*** ./src/v4/rules/text_sensory_misuse.ts ***! + \*********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }), + +/***/ "./src/v4/rules/text_spacing_valid.ts": +/*!********************************************!*\ + !*** ./src/v4/rules/text_spacing_valid.ts ***! + \********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + if (bounds['top'] < 0 || bounds['left'] < 0) + return null; + //skip no-html element + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) + return null; + // Ensure that this element has children with actual text. + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length == 0) + return null; + //font size always resolved to 'px' + var font_size_style = getComputedStyle(ruleContext).getPropertyValue('font-size'); + var font_size = parseFloat(font_size_style); + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); + if (Object.keys(styles).length === 0) + return null; + //note that CSS unit is required for non-zero values, otherwise it's ignored + var ret = []; + // matched string: original style, the style value and unit + var regex = /(-?[\d.]+)([a-z%]*)/; + var word_style = styles['word-spacing']; + if (word_style) { + if (word_style.startsWith('inherit') || word_style.startsWith('unset')) { + //get closet ancestor's word-spacing + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext.parentElement, { "word-spacing": ["*"] }, ['inherit', 'unset']); + if (ancestor !== null) { + word_style = CSSUtil_1.CSSUtil.getDefinedStyles(ancestor)['word-spacing']; + } + else if (word_style.startsWith('unset')) { + word_style = "initial"; + } + } + if (ruleContext.style.getPropertyPriority("word-spacing") === 'important') { + word_style = word_style.substring(0, word_style.length - "!important".length - 1); + // computed space is 0 for 'normal' or 'initial'. + if (word_style === 'initial' || word_style === 'normal') + ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style")); + else { + var wordSpacing = parseFloat(word_style); + if (!isNaN(wordSpacing)) { + var parsed = word_style.trim().match(regex); + if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(parsed[2], parsed[1], ruleContext); + if (pixels !== null && pixels / font_size < 0.16) + ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style")); + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + var letter_style = styles['letter-spacing']; + if (letter_style) { + if (letter_style.startsWith('inherit') || letter_style.startsWith('unset')) { + //get closet ancestor's word-spacing + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext.parentElement, { "letter-spacing": ["*"] }, ['inherit', 'unset']); + if (ancestor !== null) { + letter_style = CSSUtil_1.CSSUtil.getDefinedStyles(ancestor)['letter-spacing']; + } + else if (letter_style.startsWith('unset')) { + letter_style = "initial"; + } + } + if (ruleContext.style.getPropertyPriority("letter-spacing") === 'important') { + letter_style = letter_style.substring(0, letter_style.length - "!important".length - 1); + // computed space is 0 for 'normal' or 'initial'. + if (letter_style === 'initial' || letter_style === 'normal') + ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style")); + else { + var letterSpacing = parseFloat(letter_style); + if (!isNaN(letterSpacing)) { + var parsed = letter_style.trim().match(regex); + if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(parsed[2], parsed[1], ruleContext); + if (pixels !== null && pixels / font_size < 0.12) + ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style")); + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + var line_style = styles['line-height']; + var overflow = { "overflow": ['auto', 'scroll'], "overflow-x": ['auto', 'scroll'], "overflow-y": ['auto', 'scroll'] }; + if (line_style && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflow) === null) { + if (line_style.startsWith('inherit') || line_style.startsWith('unset')) { + //get closet ancestor's word-spacing + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext.parentElement, { "line-height": ["*"] }, ['inherit', 'unset']); + if (ancestor !== null) { + line_style = CSSUtil_1.CSSUtil.getDefinedStyles(ancestor)['line-height']; + } + else if (line_style.startsWith('unset')) { + line_style = "initial"; + } + } + if (ruleContext.style.getPropertyPriority("line-height") === 'important') { + line_style = line_style.substring(0, line_style.length - "!important".length - 1); + // computed space is 0 for 'normal' or 'initial'. + if (line_style === 'initial' || line_style === 'normal') + ret.push((0, IRule_1.RuleFail)("fail_line_height_style")); + else { + var lineHeight = parseFloat(line_style); + if (!isNaN(lineHeight)) { + var parsed = line_style.trim().match(regex); + if (parsed[2] === '') { //line-height are allowed unitless when the valie is multiple (or fraction) of the font size + if (parsed[1] < 1.5) + ret.push((0, IRule_1.RuleFail)("fail_line_height_style")); + else + ret.push((0, IRule_1.RulePass)("pass")); + } + else { + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(parsed[2], parsed[1], ruleContext); + if (pixels !== null && pixels / font_size < 1.5) + ret.push((0, IRule_1.RuleFail)("fail_line_height_style")); + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + if (ret.length > 0) + return ret; + return null; //implicable or ignore + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/text_whitespace_valid.ts": +/*!***********************************************!*\ + !*** ./src/v4/rules/text_whitespace_valid.ts ***! + \***********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/widget_tabbable_exists.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_exists.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + //let nw = new NodeWalker(ruleContext); + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rules/widget_tabbable_single.ts": +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_single.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + //let nw = new NodeWalker(ruleContext); + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + if (nw.node.nodeName.toLowerCase() === 'input' && nw.node.getAttribute("type") === 'radio') { + var curName = nw.node.getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + } + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }), + +/***/ "./src/v4/rulesets.ts": +/*!****************************!*\ + !*** ./src/v4/rulesets.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json"); +var IGuideline_1 = __webpack_require__(/*! ./api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }), + +/***/ "./src/v4/util/AccNameUtil.ts": +/*!************************************!*\ + !*** ./src/v4/util/AccNameUtil.ts ***! + \************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as the first or last child + var caption = elem.firstElementChild; + if (!caption) { + caption = elem.lastElementChild; + if (caption && caption.nodeName.toLowerCase() === 'figcaption') { + // figcaption can be mixed text + var text = caption.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_1 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_1 += " " + pair.name.trim(); + } + }); + if (text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_2 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_2 += title.trim(); + } + }); + if (text_2 && text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = element.textContent; + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_3 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_3 += desc.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlostElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlostElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) + text += " " + walkChild.nodeValue.trim(); + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }), + +/***/ "./src/v4/util/AriaUtil.ts": +/*!*********************************!*\ + !*** ./src/v4/util/AriaUtil.ts ***! + \*********************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && roleNames.includes(role)) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i]) ? CommonUtil_1.CommonUtil.getInnerText(labelNode) : ""; + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele) ? CommonUtil_1.CommonUtil.getInnerText(labelNode) : ""; + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).toLowerCase().trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele) ? CommonUtil_1.CommonUtil.getInnerText(labelNode) : ""; + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i]) ? CommonUtil_1.CommonUtil.getInnerText(labelNode) : ""; + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_1 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (scope === 'column') + tagProperty = specialTagProperties["des-table-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-table-grid-treegrid-row-scope"]; + } + else { + tagProperty = specialTagProperties["des-other"]; + } + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + } + } + } + if (applicable && !fail) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }), + +/***/ "./src/v4/util/CSSUtil.ts": +/*!********************************!*\ + !*** ./src/v4/util/CSSUtil.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + try { + if (selector.trim() === "") + return false; + if (typeof element.matches === "function") { + return element.matches(selector); + } + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Native functions not there, fallback + var matches = (element.document || element.ownerDocument).querySelectorAll(selector); + var i = 0; + while (i < matches.length && matches[i] !== element) { + ++i; + } + return i < matches.length; + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, pseudoClass) { + // console.log("Function: getDefinedStyles"); + if (!elem) + return null; + var definedStyles = {}; + var definedStylePseudo = {}; + function fillStyle(maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + //override !important only if it is also !important + map[key] = style[key] + " !important"; + //don't override !important if it is not !important + else + continue; + } + //create/overide anyway + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + } + var storedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!pseudoClass && storedStyles) { + definedStyles = storedStyles["definedStyles"]; + definedStylePseudo = storedStyles["definedStylePseudo"]; + } + else { + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < elem.ownerDocument.styleSheets.length; ++ssIndex) { + var sheet = elem.ownerDocument.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + // console.log("Got sheet"); + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + // console.log("Got rule: ", sheet.cssRules[rIndex]); + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass + ? pseudoMatch[1] + : fullRuleSelector; + var selPseudo = hasPseudoClass + ? pseudoMatch[2] + : ""; + var samePseudoClass = selPseudo === pseudoClass; + if (pseudoClass && pseudoClass === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Get styles of non-pseudo selectors + if (!hasPseudoClass && + CSSUtil.selectorMatchesElem(elem, selMain)) { + fillStyle([definedStyles, definedStylePseudo], rule.style); + } + if (samePseudoClass && + CSSUtil.selectorMatchesElem(elem, selMain)) { + fillStyle([definedStylePseudo], rule.style); + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // + // Handled the stylesheets, now handle the element defined styles + fillStyle([definedStyles, definedStylePseudo], elem.style); + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", { + definedStyles: definedStyles, + definedStylePseudo: definedStylePseudo, + }); + } + /** + * 'initial' sets the style back to default + for (const key in definedStyles) { + if (definedStyles[key] === "initial") { + delete definedStyles[key]; + } + } + for (const key in definedStylePseudo) { + if (definedStylePseudo[key] === "initial") { + delete definedStylePseudo[key]; + } + } + */ + if (!pseudoClass) { + // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStyles, null, 2)); + return definedStyles; + } + else { + for (var key in definedStylePseudo) { + if (definedStylePseudo[key] === definedStyles[key]) { + delete definedStylePseudo[key]; + } + } + // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStylePseudo, null, 2)); + return definedStylePseudo; + } + }; + /** + * Returns the media query defined for the document + * + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var elem_transforms = orientationTransforms[mediaList.item(i).toLocaleLowerCase()]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var i_1 = 0; i_1 < styleRules.length; ++i_1) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[i_1].STYLE_RULE) { + var styleRule = styleRules[i_1]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + if (key.toLocaleLowerCase() === "transform") { + if (key === "all" && styles[key]) { + delete transforms[key]; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (key.toLocaleLowerCase() === "rotate") { + transforms[key] = styles[key]; + } + elem_transforms[selector] = + transforms; + } + } + } + if (mediaList.item(i_1)) + orientationTransforms[mediaList.item(i_1).toLocaleLowerCase()] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue == 0) + return 0; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * return the ancestor with the given style properties. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {[string]} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @parm {bool} excludedValues - style values that should be ignored. + * @return {node} walkNode - A parent node of the element, which has the style properties + * @memberOf AriaUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + var walkNode = elem; + while (walkNode !== null) { + var node = CacheUtil_1.CacheUtil.getCache(walkNode, "AriaUtil_AncestorWithStyles", null); + if (node) + return node; + var styles = CSSUtil.getDefinedStyles(walkNode); + for (var style in styleProps) { + var value = styles[style]; + if (value) { + value = value.split(" ")[0]; //get rid of !important + if (!excludedValues.includes(value)) { + if (styleProps[style].includes('*')) { + CacheUtil_1.CacheUtil.setCache(walkNode, "AriaUtil_AncestorWithStyles", walkNode); + return walkNode; + } + else if (styleProps[style].includes(value)) { + CacheUtil_1.CacheUtil.setCache(walkNode, "AriaUtil_AncestorWithStyles", walkNode); + return walkNode; + } + } + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + CacheUtil_1.CacheUtil.setCache(elem, "AriaUtil_AncestorWithStyles", undefined); + return null; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }), + +/***/ "./src/v4/util/CacheUtil.ts": +/*!**********************************!*\ + !*** ./src/v4/util/CacheUtil.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.clearCaches = function (cacheRoot) { + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }), + +/***/ "./src/v4/util/ColorUtil.ts": +/*!**********************************!*\ + !*** ./src/v4/util/ColorUtil.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) {} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }), + +/***/ "./src/v4/util/CommonUtil.ts": +/*!***********************************!*\ + !*** ./src/v4/util/CommonUtil.ts ***! + \***********************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + if (element.hasAttribute("contenteditable")) + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + //let nw = new NodeWalker(root); + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + //let nw = new NodeWalker(root); + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + //let nw = new NodeWalker(parentNode); + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if ((nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase())) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue !== null) + text += nw.node.nextSibling.nodeValue; + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue !== null) { + text += nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = function (element) { return __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName != "TH"; }); }; + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor) { + if (labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = node.ownerDocument.querySelectorAll("*[aria-labelledby]"); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, node.getAttribute("aria-labelledby"))) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", false); + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + return element.getAttribute("type") !== "hidden" && !element.hasAttribute("disabled"); + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": true, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }), + +/***/ "./src/v4/util/TableUtil.ts": +/*!**********************************!*\ + !*** ./src/v4/util/TableUtil.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }), + +/***/ "./src/v4/util/VisUtil.ts": +/*!********************************!*\ + !*** ./src/v4/util/VisUtil.ts ***! + \********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + if (CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined) !== undefined) { + return CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", false)); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + return true; + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + return true; + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + return false; + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + return false; + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + return nodeVisible; + } + // Return true (node is visible) + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + return true; + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var defined_styles = CSSUtil_1.CSSUtil.getDefinedStyles(elem); + if ((defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (defined_styles['opacity'] && parseFloat(defined_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }), + +/***/ "./src/v4/sc-urls.json": +/*!*****************************!*\ + !*** ./src/v4/sc-urls.json ***! + \*****************************/ +/***/ ((module) => { + +module.exports = JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +var exports = __webpack_exports__; +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts"); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts"); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts"); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +String.prototype.startsWith = String.prototype.startsWith || function (str) { + return this.indexOf(str) === 0; +}; +String.prototype.includes = String.prototype.includes || function (str) { + return this.indexOf(str) !== -1; +}; +Array.prototype.includes = Array.prototype.includes || function (str) { + return this.indexOf(str) !== -1; +}; +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +ace = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TCxtQkFBQztBQUFELENBQUM7QUF4Qlksb0NBQVk7Ozs7Ozs7Ozs7OztBQ2xCekI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBRS9FLDBGQUEwRjtBQUMxRixJQUFNLGlCQUFpQixHQUFHO0lBQzFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFzQixPQUFlO1FBQ2pDLE9BQU8sa2RBQWtkLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUMzZSxDQUFDO0lBRWEseUJBQWdCLEdBQTlCLFVBQStCLE9BQWU7UUFDMUMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN2QixPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRS9DLFdBQVc7UUFDWCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztlQUNqQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7ZUFDekIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHO2VBQzNELE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFO1NBQ25FO1FBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRWEseUJBQWdCLEdBQTlCLFVBQStCLEtBQWEsRUFBRSxLQUFhO1FBQ3ZELElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckM7UUFFRCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFDTCxlQUFDO0FBQUQsQ0FBQztBQXJDWSw0QkFBUTs7Ozs7Ozs7Ozs7O0FDL0NyQjs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7QUFHL0UsMkZBQTZDO0FBRTdDO0lBQUE7UUFLYyxrQkFBYSxHQUFjLElBQUksQ0FBQztRQUNoQyxrQkFBYSxHQUtsQixJQUFJLENBQUM7UUFDQSxxQkFBZ0IsR0FBaUIsSUFBSSxDQUFDO0lBOEZwRCxDQUFDO0lBNUZHLGdDQUFTLEdBQVQsVUFBVSxJQUFVO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCw0QkFBSyxHQUFMLFVBQU0sSUFBVTtRQUNaLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDO2dCQUNsQixRQUFRLEVBQUUsRUFBRTtnQkFDWixTQUFTLEVBQUUsRUFBRTthQUNoQixDQUFDLENBQUM7UUFFSCxJQUFJLFNBQVMsR0FBWSxFQUFFLENBQUM7UUFDNUIsSUFBSSxNQUFNLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsd0JBQXdCLEVBQUU7WUFDNUQsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2QixNQUFNLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekM7UUFDRCxTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLEtBQXVCLFVBQVMsRUFBVCx1QkFBUyxFQUFULHVCQUFTLEVBQVQsSUFBUyxFQUFFO1lBQTdCLElBQU0sUUFBUTtZQUNmLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNsQixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1lBQ3ZDLE9BQU8sT0FBTyxFQUFFO2dCQUNaLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZCLE9BQU8sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDO2FBQ3JDO1lBQ0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixLQUFzQixVQUFRLEVBQVIscUJBQVEsRUFBUixzQkFBUSxFQUFSLElBQVEsRUFBRTtnQkFBM0IsSUFBTSxTQUFPO2dCQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBTyxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN2QjtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRVMsb0NBQWEsR0FBdkIsVUFBd0IsSUFBVTtRQUM5QixJQUFJLElBQUksR0FBWSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQztRQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7WUFDakIsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRSxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BCLFVBQVUsRUFBRSxjQUFjLENBQUMsUUFBUSxHQUFDLEdBQUcsR0FBQyxJQUFJLEdBQUMsR0FBRyxHQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUMsR0FBRztnQkFDbkYsV0FBVyxFQUFFLEVBQUU7YUFDbEIsQ0FBQyxDQUFDO1NBQ047UUFFRCxJQUFJLElBQUksR0FBRyxFQUFFO1FBQ2IsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtZQUNyQixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDdkIsSUFBSSxFQUFFLElBQUk7WUFDVixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM5QixJQUFJLEVBQUUsSUFBSTtZQUNWLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7WUFDbEUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQy9CLENBQUM7SUFDTixDQUFDO0lBRVMsbUNBQVksR0FBdEI7UUFDSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxnQ0FBUyxHQUFULFVBQVUsSUFBVTtRQUNoQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUV4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsaUNBQVUsR0FBVixVQUFXLElBQVU7UUFDakIsSUFBSSxNQUFNLEdBQWtCLEVBQUUsQ0FBQztRQUMvQixLQUFrQixVQUFxQixFQUFyQixTQUFJLENBQUMsZ0JBQWdCLEVBQXJCLGNBQXFCLEVBQXJCLElBQXFCLEVBQUU7WUFBcEMsSUFBTSxHQUFHO1lBQ1YseUJBQXlCO1lBQ3pCLG1CQUFtQjtZQUNuQixnREFBZ0Q7WUFDaEQsa0NBQWtDO1lBQ2xDLHVCQUF1QjtZQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQy9ELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ0wsbUJBQUM7QUFBRCxDQUFDO0FBMUdxQixvQ0FBWTs7Ozs7Ozs7Ozs7O0FDbkJsQzs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7QUFLL0UsaURBQWlEO0FBQ2pELGtCQUFrQjtBQUNsQixjQUFjO0FBQ2QsMERBQTBEO0FBQzFELCtFQUErRTtBQUMvRSxpRUFBaUU7QUFDakUsdUVBQXVFO0FBQ3ZFLDBFQUEwRTtBQUMxRSxpQkFBaUI7QUFDakIsNEVBQTRFO0FBQzVFLG1FQUFtRTtBQUNuRSxzRkFBc0Y7QUFDdEYsK0VBQStFO0FBQy9FLHdCQUF3QjtBQUN4Qix3RUFBd0U7QUFDeEUsOEJBQThCO0FBQzlCLHlFQUF5RTtBQUN6RSw4QkFBOEI7QUFDOUIscUVBQXFFO0FBQ3JFLDBDQUEwQztBQUMxQyxxRUFBcUU7QUFDckUsaURBQWlEO0FBQ2pELHFFQUFxRTtBQUNyRSwyQ0FBMkM7QUFDM0MsaUVBQWlFO0FBQ2pFO0lBQ0ksa0JBQ1csU0FBa0IsRUFDbEIsSUFBWSxFQUNaLEVBQVcsRUFDWCxLQUFjO1FBSGQsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osT0FBRSxHQUFGLEVBQUUsQ0FBUztRQUNYLFVBQUssR0FBTCxLQUFLLENBQVM7UUFFckIsSUFBSSxDQUFDLFNBQVM7ZUFDSCxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxXQUFXLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFDekQ7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixHQUFDLEVBQUUsR0FBQyxVQUFVLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksU0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxXQUFXLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEtBQUssV0FBVyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDckgsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1NBQ3BFO0lBQ0wsQ0FBQztJQUVNLDBCQUFPLEdBQWQsVUFBZSxPQUFtQjtRQUM5QixJQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUztTQUNqQzthQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFO1lBQ2hDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO2FBQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDekIsdUVBQXVFO1lBQ3ZFLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7YUFBTTtZQUNILG9FQUFvRTtZQUNwRSxJQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksWUFBWSxDQUFDLEVBQUUsS0FBSyxHQUFHLEVBQUU7Z0JBQ3pCLE9BQU8sWUFBWSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7YUFDM0M7aUJBQU0sSUFBSSxZQUFZLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDakMsT0FBTyxZQUFZLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQzthQUMzQztpQkFBTSxJQUFJLFlBQVksQ0FBQyxFQUFFLEtBQUssR0FBRyxFQUFFO2dCQUNoQyxPQUFPLFlBQVksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO2FBQzNDO2lCQUFNLElBQUksWUFBWSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pDLE9BQU8sWUFBWSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7YUFDM0M7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQzthQUNoRTtTQUNKO0lBQ0wsQ0FBQztJQUNMLGVBQUM7QUFBRCxDQUFDO0FBM0NZLDRCQUFRO0FBNkNyQjtJQUNJLGtCQUNXLFNBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLElBQVksRUFDWixLQUFpQixFQUNqQixTQUFpQjtRQUpqQixjQUFTLEdBQVQsU0FBUyxDQUFTO1FBQ2xCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNwQixJQUFJLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQy9DO0lBQ0wsQ0FBQztJQUVFLDBCQUFPLEdBQWQsVUFDSSxXQUFpQyxFQUNqQyxTQUFpQjtRQUVqQixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxhQUFhLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDO2VBQzlGLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUk7bUJBQzlELFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2hHLElBQUksYUFBYTtlQUNWLFFBQVEsQ0FBQyxJQUFJLEtBQUssR0FBRztlQUNyQixRQUFRLENBQUMsU0FBUyxLQUFLLEtBQUs7ZUFDNUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPO21CQUN4RCxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsRUFBRTtZQUN0RSxhQUFhLEdBQUcsS0FBSyxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXZELHVCQUF1QjtRQUN2QixJQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLEtBQTJCLFVBQVMsRUFBVCx1QkFBUyxFQUFULHVCQUFTLEVBQVQsSUFBUyxFQUFFO1lBQWpDLElBQU0sWUFBWTtZQUNuQixLQUFLLEdBQUcsS0FBSyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVM7WUFBRSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDeEMsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVMLGVBQUM7QUFBRCxDQUFDO0FBekNZLDRCQUFRO0FBMkNyQjtJQUdJLGlCQUFZLE9BQWU7UUFGM0IsZ0JBQVcsR0FBZ0IsRUFBRTtRQUd6QixJQUFJLGtCQUFrQixHQUFjLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMvRixJQUFJLE9BQU8sR0FBZ0IsRUFBRTtRQUM3QixLQUFtQixVQUFrQixFQUFsQix5Q0FBa0IsRUFBbEIsZ0NBQWtCLEVBQWxCLElBQWtCLEVBQUU7WUFBbEMsSUFBTSxJQUFJO1lBQ1gsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1lBQzNFLElBQUksUUFBUSxHQUFnQixFQUFFLENBQUM7WUFDL0IsS0FBdUIsVUFBcUMsRUFBckMsVUFBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEVBQXJDLGNBQXFDLEVBQXJDLElBQXFDLEVBQUU7Z0JBQXpELElBQU0sUUFBUTtnQkFDZixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7Z0JBQzdFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQ3RCLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ3BCLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFDMUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNaLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUFDLENBQUM7YUFDTjtZQUNELEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbEMsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQzVCLElBQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLElBQUksUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRU0sb0JBQVksR0FBbkIsVUFBb0IsT0FBZTtRQUMvQixPQUFPLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9DLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sYUFBSyxHQUFaLFVBQWEsT0FBZTtRQUN4QixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUVwRSxJQUFJLE1BQU0sR0FBZSxFQUFFLENBQUM7UUFFNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxxQkFBYSxHQUFwQixVQUFxQixPQUFlO1FBQ2hDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMxQjtpQkFBTTtnQkFDSCxLQUFnQixVQUFrQixFQUFsQixZQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFsQixjQUFrQixFQUFsQixJQUFrQixFQUFFO29CQUEvQixJQUFNLENBQUM7b0JBQ1IsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEI7YUFDSjtTQUNKO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUNMLGNBQUM7QUFBRCxDQUFDO0FBbkVZLDBCQUFPOzs7Ozs7Ozs7Ozs7QUNwSXBCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUUvRSwyRkFBNkM7QUFDN0MsbUZBQW9DO0FBQ3BDLHdGQUEwQztBQUMxQywyRkFBNkM7QUFDN0MscUZBQXlDO0FBQ3pDLG1HQUFvRDtBQUNwRCxxRkFBaUg7QUFJakgsNkZBQWdEO0FBRWhEO0lBSUkscUJBQW9CLElBQVUsRUFBUyxVQUFvQjtRQUF2QyxTQUFJLEdBQUosSUFBSSxDQUFNO1FBQVMsZUFBVSxHQUFWLFVBQVUsQ0FBVTtRQUN2RCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEYsZUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSSxnQ0FBb0IsR0FBM0IsVUFBNEIsSUFBYztRQUN0Qyx1QkFBdUI7UUFDdkIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXJCLHVEQUF1RDtRQUN2RCxXQUFXLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakQsOENBQThDO1FBQzlDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFckMsZ0RBQWdEO1FBQ2hELElBQUksY0FBYyxLQUFLLElBQUksSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUU7WUFFbEUsdUdBQXVHO1lBQ3ZHLEtBQUssSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWU7b0JBQUUsU0FBUztnQkFDekQsb0NBQW9DO2dCQUNwQyxXQUFXLElBQUksR0FBRyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO2FBQ3RGO1NBQ0o7UUFFRCxpQkFBaUI7UUFDakIsV0FBVyxJQUFJLEdBQUcsQ0FBQztRQUVuQiwwQkFBMEI7UUFDMUIsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELHlCQUFHLEdBQUgsVUFBSSxNQUFjLEVBQUUsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQzdGLElBQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkMsSUFBSSxPQUFrQyxDQUFDO1FBQ3ZDLElBQUk7WUFDQSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2pFO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixJQUFNLEdBQUcsR0FBVSxDQUFDLENBQUM7WUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0UsTUFBTSxDQUFDLENBQUM7U0FDWDtRQUNELElBQU0sT0FBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxDQUFDLE9BQU8sWUFBWSxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN2QjtRQUNELElBQUksTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUMxQixLQUFxQixVQUFPLEVBQVAsbUJBQU8sRUFBUCxxQkFBTyxFQUFQLElBQU8sRUFBRTtZQUF6QixJQUFNLE1BQU07WUFDYixJQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JGLElBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNoQixLQUFLLElBQU0sRUFBRSxJQUFJLE9BQU8sRUFBRTtnQkFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRO2FBQ2xDO1lBQ0QsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUzRCxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNSLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJO2dCQUN6QixJQUFJLEVBQUUsSUFBSTtnQkFDVixRQUFRLEVBQUUsT0FBTyxHQUFDLFNBQVM7Z0JBQzNCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN2QixNQUFNLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU07Z0JBQzdCLE9BQU8sRUFBRSxXQUFXLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQzthQUM1RSxDQUFDO1NBQ0w7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ0wsa0JBQUM7QUFBRCxDQUFDO0FBRUQ7SUE2Qkk7UUFkQSxZQUFPLEdBQXVDLEVBQUUsQ0FBQztRQUNqRCxZQUFPLEdBQTRCLEVBQUUsQ0FBQztRQUN0QyxtQkFBYyxHQUFtQyxFQUFFLENBQUM7UUFDcEQsV0FBTSxHQUFZLEVBQUU7UUFDcEIsWUFBTyxHQUFhLEVBQUU7UUFFZCxjQUFTLEdBRWIsRUFBRTtRQUVFLGNBQVMsR0FFYixFQUFFO1FBR0YsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxxQkFBUyxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBL0JhLG1CQUFZLEdBQTFCO1FBQ0ksSUFBTSxHQUFHLEdBQUcsT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQVEsT0FBZSxDQUFDLFFBQVEsS0FBSyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUM5RywyQ0FBMkM7UUFDM0MsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxFQUFFO1lBQ0wsUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDckUsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUMsR0FBRyxDQUFDLENBQUM7YUFDdkQ7aUJBQU07Z0JBQ0gsUUFBUSxHQUFHLE9BQU8sQ0FBQzthQUN0QjtTQUNKO1FBQ0QsT0FBTyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLFNBQVMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFvQkQsb0JBQUcsR0FBSCxVQUFJLElBQXFCLEVBQUUsT0FBWTtRQUNuQyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDZixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDMUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHdCQUF3QixFQUFFO1lBQzlDLElBQUksR0FBSSxJQUFpQixDQUFDLGVBQWUsQ0FBQztTQUM3QztRQUNELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBRSxJQUFJLENBQUMsYUFBcUIsQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNwRixxQkFBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBTSxNQUFNLEdBQVk7WUFDcEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxXQUFXLEVBQUUsQ0FBQztZQUNkLFFBQVEsRUFBRSxDQUFDO1lBQ1gsU0FBUyxFQUFFLENBQUM7U0FDZjtRQUNELElBQU0sS0FBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkMseUJBQXlCO1FBQ3pCLEtBQUssSUFBTSxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QztRQUVELGtDQUFrQztRQUNsQyxHQUFHO1lBQ0Msb0RBQW9EO1lBQ3BELElBQU0sa0JBQWtCLEdBQTBCLEVBQUUsQ0FBQztZQUNyRCxLQUFLLElBQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO29CQUNqQixrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQy9FLG1GQUFtRjtvQkFDL0UsdUNBQXVDO29CQUN2QyxVQUFVO29CQUNWLHFGQUFxRjtvQkFDakYsd0RBQXdEO29CQUNwRCxnR0FBZ0c7b0JBQ3BHLElBQUk7b0JBQ1IsSUFBSTtvQkFDUixJQUFJO2lCQUNQO3FCQUFNO29CQUNILGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbkY7YUFDSjtZQUVELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRTttQkFDeEIsQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUNsQyxtREFBbUQ7dUJBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU07dUJBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU87dUJBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFVBQVU7dUJBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU87dUJBQzlDLENBQUMsaUJBQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ2pELEVBQ0g7Z0JBQ0UsSUFBSSxPQUFPLEdBQWlCLEVBQUUsQ0FBQztnQkFDL0IsS0FBSyxJQUFNLEVBQUUsSUFBSSxrQkFBa0IsRUFBRTtvQkFDakMsSUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RDLElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDO2lCQUMxQjtnQkFFRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxRQUFRLEdBQUcsRUFBRTtnQkFDakIsS0FBMkIsVUFBYSxFQUFiLCtCQUFhLEVBQWIsMkJBQWEsRUFBYixJQUFhLEVBQUU7b0JBQXJDLElBQU0sWUFBWTtvQkFDbkIsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7b0JBQ2hDLEtBQWtCLFVBQW9DLEVBQXBDLGlCQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxFQUFFLEVBQXBDLGNBQW9DLEVBQXBDLElBQW9DLEVBQUU7d0JBQW5ELElBQU0sR0FBRzt3QkFDVixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzs0QkFBRSxvQkFBb0IsR0FBRyxLQUFLLENBQUM7cUJBQ3BEO29CQUNELElBQUksb0JBQW9CLEVBQUU7d0JBQ3RCLElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQzt3QkFDM0IsSUFBSTs0QkFDQSxPQUFPLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO3lCQUMxRTt3QkFBQyxPQUFPLEdBQUcsRUFBRTs0QkFDVix3REFBd0Q7NEJBQ3hELG1DQUFtQzt5QkFDdEM7d0JBQ0QsOENBQThDO3dCQUM5QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFOzRCQUN0QixRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7eUJBQ3pDO3dCQUNELEtBQXFCLFVBQU8sRUFBUCxtQkFBTyxFQUFQLHFCQUFPLEVBQVAsSUFBTyxFQUFFOzRCQUF6QixJQUFNLE1BQU07NEJBQ2IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzVCLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQzs0QkFDbkMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNyQixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssdUJBQWUsQ0FBQyxJQUFJLEVBQUU7Z0NBQzFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDOzZCQUNsQzt5QkFDSjtxQkFDSjtpQkFDSjthQUNKO1NBQ0osUUFBUSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDNUIscUJBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFDLEtBQUssQ0FBQztRQUM5QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELDRCQUFXLEdBQVgsVUFBWSxPQUFpQjtRQUN6QixLQUFLLElBQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1NBQ3hDO1FBQ0QsS0FBcUIsVUFBYSxFQUFiLFlBQU8sSUFBSSxFQUFFLEVBQWIsY0FBYSxFQUFiLElBQWEsRUFBRTtZQUEvQixJQUFNLE1BQU07WUFDYixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFDLE1BQU0sRUFBQyx1QkFBdUIsQ0FBQyxDQUFDO2FBQ25FO2lCQUFNO2dCQUNILElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzthQUN2QztTQUNKO0lBQ0wsQ0FBQztJQUVELHdCQUFPLEdBQVAsVUFBUSxNQUFjO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsNEJBQVcsR0FBWDtRQUNJLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixLQUFLLElBQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2QjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCx5QkFBUSxHQUFSLFVBQVMsS0FBYTtRQUNsQixLQUFtQixVQUFLLEVBQUwsZUFBSyxFQUFMLG1CQUFLLEVBQUwsSUFBSyxFQUFFO1lBQXJCLElBQU0sSUFBSTtZQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCx3QkFBTyxHQUFQLFVBQVEsSUFBVSxFQUFFLFFBQWtCO1FBQ2xDLElBQUksSUFBSSxHQUFjLGlCQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUMsTUFBTSxFQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDM0UsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDNUIsS0FBa0IsVUFBSSxFQUFKLGFBQUksRUFBSixrQkFBSSxFQUFKLElBQUksRUFBRTtZQUFuQixJQUFNLEdBQUc7WUFDVixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO2dCQUNWLE1BQU0sR0FBRyxNQUFNLEdBQUMsSUFBSSxHQUFDLEdBQUcsQ0FBQzthQUM1QjtZQUNELEVBQUUsR0FBRyxDQUFDO1lBQ04sSUFBSSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDO1lBQzFDLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQy9DLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUMsR0FBRyxHQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkQsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO2dCQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNqRDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNqRDtTQUNKO1FBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNyQjtJQUNMLENBQUM7SUFFRCwyQkFBVSxHQUFWO1FBQ0ksS0FBSyxJQUFNLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsS0FBa0IsRUFBRSxLQUFrQjtnQkFDN0QsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDOUUsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDOUUscUNBQXFDO2dCQUNyQyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDMUUscUNBQXFDO2dCQUNyQyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pFLDRCQUE0QjtnQkFDNUIsT0FBTyxDQUFDLENBQUM7WUFDYixDQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsS0FBSyxJQUFNLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsS0FBa0IsRUFBRSxLQUFrQjtnQkFDN0QsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDOUUsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDOUUscUNBQXFDO2dCQUNyQyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDMUUscUNBQXFDO2dCQUNyQyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3pFLDRCQUE0QjtnQkFDNUIsT0FBTyxDQUFDLENBQUM7WUFDYixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELDBCQUFTLEdBQVQsVUFBVSxHQUFXO1FBQ2pCLEtBQUssSUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO0lBQ0wsQ0FBQztJQUVELDJCQUFVLEdBQVYsVUFBVyxHQUFZO1FBQ25CLEtBQUssSUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztJQUVELDJCQUFVLEdBQVYsVUFBVyxNQUFjLEVBQUUsT0FBd0IsRUFBRSxPQUFrQjtRQUNuRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTtZQUNmLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUN6QztRQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDNUMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLE1BQU0sR0FBQyxHQUFHLEdBQUMsT0FBTyxDQUFDO1FBQ2hELE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQ3ZDLFVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxZQUFZLElBQUssY0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFuQixDQUFtQixDQUNoRSxDQUFDO0lBQ04sQ0FBQztJQUVELHdCQUFPLEdBQVAsVUFBUSxNQUFjLEVBQUUsUUFBeUIsRUFBRSxTQUFrQjtRQUNqRSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ1osb0JBQW9CO1lBQ3BCLFNBQVMsR0FBRyxRQUFRLENBQUM7U0FDeEI7UUFDRCxPQUFPLFVBQUcsZUFBTSxDQUFDLFFBQVEsY0FBSSxTQUFTLGlCQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFFLENBQUM7SUFDckYsQ0FBQztJQUVELDJCQUFVLEdBQVYsVUFBVyxNQUFjLEVBQUUsT0FBd0I7UUFDL0MsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7WUFDZixNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDekM7UUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzdDLE9BQU8sR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNoRDthQUFNO1lBQ0gsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckM7UUFFRCxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sTUFBTSxHQUFDLEdBQUcsR0FBQyxPQUFPLENBQUM7UUFDeEMsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELDBCQUFTLEdBQVQsVUFBVSxNQUFlO1FBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2pELENBQUM7SUFFYyxZQUFLLEdBQXBCLFVBQXFCLElBQWlCLEVBQ2xDLFdBQWlDO1FBRWpDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQzVDLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDekMsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUVqQyw0RkFBNEY7UUFDNUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkUsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCw4Q0FBOEM7UUFDOUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsMEVBQTBFO1FBQzFFLG1EQUFtRDtRQUNuRCxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUMvQixPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsRUFBRSxPQUFPLENBQUM7UUFDVixJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQUksSUFBSSxXQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBeEIsQ0FBd0IsQ0FBQyxFQUFFO1lBQy9FLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSx1Q0FBb0MsQ0FBQyxDQUFDO1lBQ2hGLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0Qsb0dBQW9HO1FBQ3BHLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RixPQUFPLE9BQU8sSUFBSSxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRTtZQUNqQyxJQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsSUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDckUsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDZCx3Q0FBd0M7b0JBQ3hDLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtxQkFBTTtvQkFDSCxxQ0FBcUM7b0JBQ3JDLEVBQUUsT0FBTyxDQUFDO29CQUNWLEVBQUUsT0FBTyxDQUFDO2lCQUNiO2FBQ0o7aUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsRUFBRTtnQkFDL0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNoQiwyQkFBMkI7b0JBQzNCLElBQUksV0FBVyxFQUFFO3dCQUNiLEVBQUUsT0FBTyxDQUFDO3FCQUNiO29CQUNELG9EQUFvRDtvQkFDcEQsRUFBRSxPQUFPLENBQUM7aUJBQ2I7cUJBQU0sSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDckIsK0NBQStDO29CQUMvQyxPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU07b0JBQ0gsaUZBQWlGO29CQUNqRixJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7b0JBQ3hCLEtBQUssSUFBSSxTQUFTLEdBQUcsT0FBTyxHQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFO3dCQUN6RSxXQUFXLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDckU7b0JBQ0QsSUFBSSxXQUFXO3dCQUFFLE9BQU8sS0FBSyxDQUFDOzt3QkFDekIsRUFBRSxPQUFPLENBQUM7aUJBQ2xCO2FBQ0o7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsR0FBQyxJQUFJLENBQUMsU0FBUyxHQUFDLG1CQUFtQixDQUFDLENBQUM7YUFDNUU7U0FDSjtRQUNELE9BQU8sT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTyxpQ0FBZ0IsR0FBeEIsVUFBeUIsT0FBOEI7UUFDbkQsSUFBSSxPQUFPLEdBQW1CLEVBQUUsQ0FBQztRQUNqQyxTQUFTLFVBQVUsQ0FBQyxLQUFvQjtZQUNwQyxLQUFtQixVQUFLLEVBQUwsZUFBSyxFQUFMLG1CQUFLLEVBQUwsSUFBSyxFQUFFO2dCQUFyQixJQUFNLElBQUk7Z0JBQ1gsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRTtvQkFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdEI7YUFDSjtRQUNMLENBQUM7UUFDRCxLQUFLLElBQU0sRUFBRSxJQUFJLE9BQU8sRUFBRTtZQUN0QixJQUFJLElBQUksR0FBRyxFQUFFLEdBQUMsR0FBRyxHQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0YsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNwQztZQUNELEtBQUssSUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDaEMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO29CQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUNyQzthQUNKO1lBQ0QsSUFBSSxJQUFJLEtBQUssRUFBRSxHQUFDLE9BQU8sRUFBRTtnQkFDckIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDMUIsSUFBSSxFQUFFLEdBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7d0JBQzVCLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDdkM7aUJBQ0o7cUJBQU07b0JBQ0gsSUFBSSxFQUFFLEdBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7d0JBQzNCLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdEM7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gseUJBQVEsR0FBUixVQUFTLE9BQXNCO1FBQzNCLElBQUksUUFBUSxHQUFrQixFQUFFLENBQUM7UUFDakMsS0FBbUIsVUFBTyxFQUFQLG1CQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPLEVBQUU7WUFBdkIsSUFBTSxJQUFJO1lBQ1gsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QjtRQUVELElBQUksTUFBTSxHQUFtQixFQUFFLENBQUM7UUFDaEMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLHFIQUFxSDtRQUNySCx5REFBeUQ7UUFDekQsOEVBQThFO1FBQzlFLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixHQUFHO1lBQ0MsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNmLEtBQUssSUFBSSxHQUFHLEdBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUN4QyxJQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksUUFBUTtvQkFBRSxTQUFTO2dCQUMxQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDbkUsS0FBb0IsVUFBeUIsRUFBekIsWUFBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQXpCLGNBQXlCLEVBQXpCLElBQXlCLEVBQUU7d0JBQTFDLElBQU0sS0FBSzt3QkFDWixJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEVBQUU7NEJBQ3RCLFFBQVEsR0FBRyxLQUFLLENBQUM7eUJBQ3BCO3FCQUNKO2lCQUNKO2dCQUNELGlFQUFpRTtnQkFDakUsa0RBQWtEO2dCQUNsRCxzQ0FBc0M7Z0JBQ3RDLGdDQUFnQztnQkFDaEMsb0NBQW9DO2dCQUNwQyxRQUFRO2dCQUNSLElBQUk7Z0JBQ0osSUFBSSxRQUFRLEVBQUU7b0JBQ1YsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNyQixRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzdCO2FBQ0o7U0FDSixRQUFRLE1BQU0sRUFBRTtRQUNqQixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ0wsYUFBQztBQUFELENBQUM7QUF6YVksd0JBQU07Ozs7Ozs7Ozs7OztBQzFIbkI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBRS9FO0lBQUE7SUFHQSxDQUFDO0lBRlUsWUFBSyxHQUFHLEtBQUssQ0FBQztJQUNkLGVBQVEsR0FBRyxxQ0FBcUMsQ0FBQztJQUM1RCxhQUFDO0NBQUE7QUFIWSx3QkFBTTs7Ozs7Ozs7Ozs7O0FDaEJuQjs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFL0UsMEdBQXNEO0FBRXRELG1HQUFvRDtBQUVwRDtJQUErQiw2QkFBWTtJQUEzQzs7SUFpRkEsQ0FBQztJQWhGRywyQkFBTyxHQUFQLFVBQVEsSUFBVTtRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsZ0NBQVksR0FBWjtRQUNJLE9BQU8sS0FBSztJQUNoQixDQUFDO0lBQ0QsaUNBQWEsR0FBYixVQUFjLElBQVU7UUFDcEIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCLEVBQUU7WUFDN0MsSUFBTSxJQUFJLEdBQUcsSUFBZSxDQUFDO1lBQzdCLEtBQUssSUFBSSxHQUFHLEdBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDL0MsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2FBQzVEO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDZCQUFTLEdBQVQsVUFBVSxJQUFVO1FBQ2hCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMscUJBQXFCO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFM0QsSUFBTSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBZSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pGLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUNyQixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFO2dCQUN6RyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7YUFDaEU7WUFDRCxJQUFJLE1BQU0sR0FBSSxJQUFnQixDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFFdkQseUdBQXlHO1lBQ3pHLElBQUksTUFBTSxFQUFFO2dCQUNSLElBQUksU0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7Z0JBQzFILElBQUksU0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7Z0JBQzFILElBQU0sR0FBRyxHQUFHO29CQUNSLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxTQUFPLENBQUMsR0FBRyxVQUFVLENBQUM7b0JBQ3ZELEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxTQUFPLENBQUMsR0FBRyxVQUFVLENBQUM7b0JBQ3JELFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO29CQUMvQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztpQkFDaEQsQ0FBQztnQkFDRixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFlLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzdELE9BQU8sR0FBRyxDQUFDO2FBQ2Q7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx1Q0FBbUIsR0FBbkIsVUFBb0IsSUFBVTtRQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHFCQUFxQjtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTNELElBQU0sS0FBSyxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQWUsRUFBRSw0QkFBNEIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDckIsSUFBTSxNQUFNLEdBQUksSUFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3pELDZCQUE2QjtZQUM3QixJQUFJLE1BQU0sRUFBRTtnQkFDUixJQUFJLFNBQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO2dCQUMxSCxJQUFJLFNBQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO2dCQUMxSCxJQUFNLEdBQUcsR0FBRztvQkFDUixNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQU8sQ0FBQztvQkFDeEMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxTQUFPLENBQUM7b0JBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ2xDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7aUJBQ25DLENBQUM7Z0JBQ0YscUJBQVMsQ0FBQyxRQUFRLENBQUMsSUFBZSxFQUFFLDRCQUE0QixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RSxPQUFPLEdBQUcsQ0FBQzthQUNkO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDTCxnQkFBQztBQUFELENBQUMsQ0FqRjhCLDJCQUFZLEdBaUYxQztBQWpGWSw4QkFBUzs7Ozs7Ozs7Ozs7O0FDcEJ0Qjs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7QUFFL0Usc0ZBQXdDO0FBRXhDO0lBQUE7SUFvR0EsQ0FBQztJQWxHVSxpQkFBUyxHQUFoQixVQUFpQixJQUFVLEVBQUUsS0FBYztRQUN2QyxJQUFJLENBQUMsR0FBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JDLENBQUMsR0FBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsQztRQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLENBQUM7SUFFTSxtQkFBVyxHQUFsQixVQUFtQixJQUFVLEVBQUUsS0FBYztRQUN6QyxJQUFJLENBQUMsR0FBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFO1lBQ25ELENBQUMsR0FBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVNLGdCQUFRLEdBQWYsVUFBZ0IsQ0FBTyxFQUFFLENBQU87UUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRTtZQUNyQixPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUI7YUFBTSxJQUFJLENBQUMsQ0FBQyx1QkFBdUIsRUFBRTtZQUNsQyxPQUFPLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNILG1EQUFtRDtZQUNuRCxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVNLHVCQUFlLEdBQXRCLFVBQXVCLENBQVM7UUFDNUIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU0sa0JBQVUsR0FBakIsVUFBa0IsQ0FBUztRQUN2QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQscUVBQXFFO0lBQzlELHFCQUFhLEdBQXBCLFVBQXFCLFFBQVEsRUFBRSxRQUFRO1FBQ25DLElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRTtZQUN0QixJQUFNLFVBQVUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLElBQU0sT0FBTyxHQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELElBQU0sT0FBTyxHQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pELElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztnQkFDekUsT0FBTyxJQUFJLENBQUM7U0FDbkI7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU0sc0JBQWMsR0FBckIsVUFBc0IsSUFBVTtRQUM1QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDZCxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUMsaUNBQWlDO1lBQ3JFLEVBQUUsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDhCQUFzQixHQUE3QixVQUE4QixHQUFRO1FBQ2xDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDckIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDekIsSUFBSSxPQUFPLEdBQUcsS0FBSyxVQUFVLEVBQUU7Z0JBQzNCLE9BQU8sR0FBRyxDQUFDO2FBQ2Q7aUJBQU07Z0JBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMxQztTQUNKO2FBQU0sSUFBSSxHQUFHLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQzlDLE9BQU8sR0FBRyxDQUFDO1NBQ2Q7YUFBTTtZQUNILElBQUksTUFBTSxVQUFDO1lBQ1gsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7Z0JBQ2xDLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ1osS0FBbUIsVUFBRyxFQUFILFdBQUcsRUFBSCxpQkFBRyxFQUFILElBQUcsRUFBRTtvQkFBbkIsSUFBTSxJQUFJO29CQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ2xEO2FBQ0o7aUJBQU07Z0JBQ0gsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDWixLQUFLLElBQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtvQkFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDdkQ7YUFDSjtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQUVhLGdDQUF3QixHQUF0QyxVQUF1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVM7UUFDL0QsSUFBSSxRQUFRLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsT0FBTyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ3RCLElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCLElBQWMsUUFBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTO2dCQUMzRyxPQUFPLFFBQVEsQ0FBQztZQUNwQixRQUFRLEdBQUcscUJBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0wsY0FBQztBQUFELENBQUM7QUFwR1ksMEJBQU87Ozs7Ozs7Ozs7OztBQ2xCcEI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBRS9FLDZGQUFnRDtBQUNoRDs7Ozs7Ozs7R0FRRztBQUNIO0lBT0ksbUJBQVksT0FBYyxFQUFFLElBQWUsRUFBRSxJQUFZLEVBQUUsY0FBeUIsRUFBRSxLQUFlO1FBcUdyRyxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsV0FBTSxHQUFHLENBQUMsQ0FBQztRQXJHUCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksR0FBSSxJQUFJLENBQUMsSUFBaUIsQ0FBQyxlQUFlO1NBQ3REO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksR0FBSSxJQUFJLENBQUMsSUFBaUIsQ0FBQyxlQUFlO1NBQ3REO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxJQUFJLEtBQUssQ0FBQztJQUNsRCxDQUFDO0lBRUQsd0JBQUksR0FBSjtRQUNJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFtQixJQUFJLElBQUksQ0FBQztJQUN4RSxDQUFDO0lBRU0sb0JBQVUsR0FBakIsVUFBa0IsSUFBVTtRQUN4QixJQUFJLElBQUksS0FBSyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMvQixJQUFLLElBQVksQ0FBQyxTQUFTLEVBQUU7WUFDekIsQ0FBQyxHQUFJLElBQVksQ0FBQyxTQUFTLENBQUM7U0FDL0I7YUFBTSxJQUFLLElBQVksQ0FBQyxZQUFZLEVBQUU7WUFDbkMsQ0FBQyxHQUFJLElBQVksQ0FBQyxZQUFZLENBQUM7U0FDbEM7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFBRTtZQUMvQixJQUFLLENBQWdCLENBQUMsSUFBSSxFQUFFO2dCQUN4QixDQUFDLEdBQUksQ0FBZ0IsQ0FBQyxJQUFJLENBQUM7YUFDOUI7aUJBQU07Z0JBQ0gsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNaO1NBQ0o7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFTSx1QkFBYSxHQUFwQixVQUFxQixJQUFVO1FBQzNCLElBQUksSUFBSSxHQUFhLElBQWUsQ0FBQztRQUNyQyxHQUFHO1lBQ0MsSUFBSSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFZLENBQUM7U0FDaEQsUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLHFCQUFXLEdBQWxCLFVBQW1CLElBQWdCO1FBQy9CLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxLQUFLLElBQUksS0FBSyxHQUFDLENBQUMsRUFBRSxLQUFLLEdBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRTtZQUMzQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsSUFBSSxhQUFhLEdBQUcsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2hELEtBQUssSUFBSSxTQUFTLEdBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFO2dCQUM5RCxhQUFhLENBQUMsU0FBUyxDQUFTLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztnQkFDekQsYUFBYSxDQUFDLFNBQVMsQ0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7YUFDM0Q7U0FDSjtJQUNMLENBQUM7SUFFTSxrQ0FBd0IsR0FBL0IsVUFBZ0MsSUFBVTtRQUN0QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzdCLE9BQU8sTUFBTSxJQUFLLE1BQWMsQ0FBQyxTQUFTLEVBQUU7WUFDeEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7U0FDL0I7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU0saUNBQXVCLEdBQTlCLFVBQStCLElBQVU7UUFDckMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM1QixPQUFPLE1BQU0sSUFBSyxNQUFjLENBQUMsU0FBUyxFQUFFO1lBQ3hDLE1BQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVNLG1DQUF5QixHQUFoQyxVQUFpQyxJQUFTO1FBQ3RDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDOUIsT0FBTyxNQUFNLElBQUssTUFBYyxDQUFDLFNBQVMsRUFBRTtZQUN4QyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztTQUMvQjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTSx1Q0FBNkIsR0FBcEMsVUFBcUMsSUFBUztRQUMxQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxJQUFLLE1BQWMsQ0FBQyxTQUFTLEVBQUU7WUFDeEMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7U0FDbkM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsMEJBQU0sR0FBTjtRQUNJLElBQUssSUFBWSxDQUFDLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUMxQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3RDthQUFNO1lBQ0gsbURBQW1EO1lBQ25ELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDO1NBQ3hDO0lBQ0wsQ0FBQztJQUlELDRCQUFRLEdBQVI7UUFBQSxpQkEyR0M7UUExR0csSUFBTSxNQUFNLEdBQUc7WUFDWCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWCxLQUFLLElBQUksR0FBRyxHQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsS0FBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDcEMsQ0FBQyxJQUFJLEdBQUcsQ0FBQzthQUNaO1lBQ0QsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDO1FBQ0QsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLDZDQUE0QztRQUM1RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsR0FBRztZQUNDLGlJQUFpSTtZQUNqSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZixJQUFJLFVBQVUsR0FBSSxJQUFJLENBQUMsSUFBMEIsQ0FBQztnQkFDbEQsSUFBSSxXQUFXLEdBQUksSUFBSSxDQUFDLElBQW9CLENBQUM7Z0JBQzdDLElBQUksV0FBVyxHQUFJLElBQUksQ0FBQyxJQUF3QjtnQkFDaEQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCO3VCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUM3QyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7dUJBQ2hFLFVBQVUsQ0FBQyxlQUFlO3VCQUMxQixVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFDakQ7b0JBQ0ksR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3BDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUM7b0JBQ3RELElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztpQkFDbEQ7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCO3VCQUNwRCxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7dUJBQ2pFLFdBQVcsQ0FBQyxVQUFVO3VCQUN0QixXQUFXLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFDeEM7b0JBQ0ksR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO29CQUNsQyxJQUFJLENBQUMsSUFBWSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7b0JBQy9DLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQWtCLENBQUMsQ0FBQztpQkFDbEQ7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO3VCQUM1QixXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU07dUJBQzdDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM3QztvQkFDSSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzlDO3FCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDLGlDQUFpQyxDQUFDO3VCQUNySCxTQUFTLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsRCxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzdEO3FCQUFNO29CQUNILEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2lCQUN2QjthQUNKO2lCQUFNO2dCQUNILEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUN0QyxPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU0sSUFBSyxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsRUFBRTtvQkFDckMsSUFBSSxTQUFTLEdBQUksSUFBSSxDQUFDLElBQVksQ0FBQyxTQUFTLENBQUM7b0JBQzdDLElBQUksYUFBYSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztvQkFDbkQsdUNBQXVDO29CQUN2Qyx1Q0FBdUM7b0JBQ3ZDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLEVBQUU7d0JBQ2xELEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztxQkFDeEI7eUJBQU07d0JBQ0gsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUN2QjtpQkFDSjtxQkFBTSxJQUFLLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxFQUFFO29CQUN4QyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxDQUFDO29CQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDdkI7cUJBQU0sSUFBSSxTQUFTLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN2RCxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUN0QyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUM3QixHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNILEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQ3hDLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FDUCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFFO21CQUNqRixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSyxJQUFJLENBQUMsSUFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQzdGLEVBQUU7Z0JBQ0MsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFDLFdBQUksSUFBSSxDQUFDLE9BQU8sRUFBQyxJQUFHLEVBQUMsR0FBRSxTQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxxQkFBVyxTQUFTLGVBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFVLENBQUMsQ0FBQzthQUN0STtTQUNKLFFBQ0csQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBRTtlQUNqRixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSyxJQUFJLENBQUMsSUFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQzVGO1FBQ0YsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBQyxXQUFJLElBQUksQ0FBQyxPQUFPLEVBQUMsSUFBRyxFQUFDLEdBQUUsU0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEscUJBQVcsU0FBUyxlQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBRSxDQUFDLENBQUM7UUFDM0gsSUFBSSxDQUFDLEtBQUssSUFBSyxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFDLHFCQUFlLElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBRSxDQUFDLENBQUM7UUFDMUgsSUFBSSxDQUFDLEtBQUssSUFBSyxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFDLHFCQUFlLElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxDQUFFLENBQUMsQ0FBQztRQUNqSCxJQUFJLENBQUMsS0FBSyxJQUFLLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUMsd0JBQWtCLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBRSxDQUFDLENBQUM7UUFDbkksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELDRCQUFRLEdBQVI7UUFDSSxHQUFHO1lBQ0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLElBQUksVUFBVSxHQUFJLElBQUksQ0FBQyxJQUEwQixDQUFDO2dCQUNsRCxJQUFJLFdBQVcsR0FBSSxJQUFJLENBQUMsSUFBb0IsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCO3VCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUM3QyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7dUJBQ2hFLFVBQVUsQ0FBQyxlQUFlO3VCQUMxQixVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFDakQ7b0JBQ0ksSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2lCQUNsRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUI7dUJBQ3BELENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzt1QkFDakUsV0FBVyxDQUFDLFVBQVU7dUJBQ3RCLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUN2QztvQkFDSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztvQkFDL0MsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBa0IsQ0FBQyxDQUFDO2lCQUNsRDtxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQzt1QkFDbkYsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDakQsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM1RDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztpQkFDeEI7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU0sSUFBSSxTQUFTLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUMzRCxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2lCQUN2QjtxQkFBTSxJQUFLLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxFQUFFO29CQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxDQUFDO29CQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztpQkFDeEI7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1NBQ0osUUFDRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFFO2VBQ3pHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFLLElBQUksQ0FBQyxJQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLENBQUMsRUFDNUY7UUFDRixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0wsZ0JBQUM7QUFBRCxDQUFDO0FBOVFZLDhCQUFTOzs7Ozs7Ozs7Ozs7QUMxQnRCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUUvRSwwR0FBc0Q7QUFFdEQ7SUFBaUMsK0JBQVk7SUFBN0M7O0lBbUJBLENBQUM7SUFsQkcsNkJBQU8sR0FBUCxVQUFRLElBQVU7UUFDZCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBQ0Qsa0NBQVksR0FBWjtRQUNJLE9BQU8sS0FBSztJQUNoQixDQUFDO0lBQ0QsbUNBQWEsR0FBYixVQUFjLElBQVU7UUFDcEIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCLEVBQUU7WUFDN0MsSUFBTSxJQUFJLEdBQUcsSUFBZSxDQUFDO1lBQzdCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BFLEtBQUssSUFBSSxHQUFHLEdBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUNyQyxJQUFNLE1BQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxNQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBSSxDQUFDLENBQUM7YUFDOUI7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDTCxrQkFBQztBQUFELENBQUMsQ0FuQmdDLDJCQUFZLEdBbUI1QztBQW5CWSxrQ0FBVzs7Ozs7Ozs7Ozs7O0FDbEJ4Qjs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7QUFJL0UsSUFBWSxhQUtYO0FBTEQsV0FBWSxhQUFhO0lBQ3JCLGdDQUFlO0lBQ2YsZ0NBQWU7SUFDZixrQ0FBaUI7SUFDakIsaUNBQWdCO0FBQ3BCLENBQUMsRUFMVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQUt4QjtBQUVELElBQVksa0JBSVg7QUFKRCxXQUFZLGtCQUFrQjtJQUMxQixxREFBK0I7SUFDL0IsdUNBQWlCO0lBQ2pCLHFDQUFlO0FBQ25CLENBQUMsRUFKVyxrQkFBa0IsR0FBbEIsMEJBQWtCLEtBQWxCLDBCQUFrQixRQUk3QjtBQUVELElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN0QixxQ0FBbUI7SUFDbkIseUNBQXVCO0FBQzNCLENBQUMsRUFIVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQUd6Qjs7Ozs7Ozs7Ozs7O0FDbENEOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQVMvRSxJQUFZLGVBS1g7QUFMRCxXQUFZLGVBQWU7SUFDdkIsZ0NBQWE7SUFDYixnQ0FBYTtJQUNiLDBDQUF1QjtJQUN2QixvQ0FBaUI7QUFDckIsQ0FBQyxFQUxXLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVCQUFlLFFBSzFCO0FBRUQsSUFBWSxXQUlYO0FBSkQsV0FBWSxXQUFXO0lBQ25CLHNDQUF1QjtJQUN2QixnREFBaUM7SUFDakMsMENBQTJCO0FBQy9CLENBQUMsRUFKVyxXQUFXLEdBQVgsbUJBQVcsS0FBWCxtQkFBVyxRQUl0QjtBQUVELFNBQWdCLFFBQVEsQ0FBQyxRQUF5QixFQUFFLFdBQXVCLEVBQUUsT0FBZ0I7SUFDekYsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLElBQUksUUFBUSxLQUFLLElBQUk7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDdkcsT0FBTztRQUNILEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQztRQUN0RCxRQUFRLEVBQUUsUUFBUTtRQUNsQixXQUFXLEVBQUUsV0FBVyxJQUFJLEVBQUU7UUFDOUIsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFO0tBQ3pCO0FBQ0wsQ0FBQztBQVJELDRCQVFDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLFFBQXlCLEVBQUUsV0FBdUIsRUFBRSxPQUFnQjtJQUMzRixJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsSUFBSSxRQUFRLEtBQUssSUFBSTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUN2RyxPQUFPO1FBQ0gsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDO1FBQ3RELFFBQVEsRUFBRSxDQUFDO1FBQ1gsV0FBVyxFQUFFLFdBQVcsSUFBSSxFQUFFO1FBQzlCLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtLQUN6QjtBQUNMLENBQUM7QUFSRCxnQ0FRQztBQUNELFNBQWdCLFFBQVEsQ0FBQyxRQUF5QixFQUFFLFdBQXVCLEVBQUUsT0FBZ0I7SUFDekYsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLElBQUksUUFBUSxLQUFLLElBQUk7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDdkcsT0FBTztRQUNILEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQztRQUN0RCxRQUFRLEVBQUUsUUFBUTtRQUNsQixXQUFXLEVBQUUsV0FBVyxJQUFJLEVBQUU7UUFDOUIsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFO0tBQ3pCO0FBQ0wsQ0FBQztBQVJELDRCQVFDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLFFBQXlCLEVBQUUsV0FBdUIsRUFBRSxPQUFnQjtJQUM5RixJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsSUFBSSxRQUFRLEtBQUssSUFBSTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUN2RyxPQUFPO1FBQ0gsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQzNELFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFdBQVcsRUFBRSxXQUFXLElBQUksRUFBRTtRQUM5QixPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUU7S0FDekI7QUFDTCxDQUFDO0FBUkQsc0NBUUM7QUFFRCxTQUFnQixVQUFVLENBQUMsUUFBeUIsRUFBRSxXQUF1QixFQUFFLE9BQWdCO0lBQzNGLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxJQUFJLFFBQVEsS0FBSyxJQUFJO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ3ZHLE9BQU87UUFDSCxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDeEQsUUFBUSxFQUFFLFFBQVE7UUFDbEIsV0FBVyxFQUFFLFdBQVcsSUFBSSxFQUFFO1FBQzlCLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtLQUN6QjtBQUNMLENBQUM7QUFSRCxnQ0FRQztBQStHRDs7R0FFRztBQUNILHlGQUE2QztBQUFwQyx5SEFBYTtBQUV0Qjs7R0FFRztBQUNILHlGQUFtRTtBQUExRCw4SEFBa0IsUUFBaUI7QUFFNUM7O0dBRUc7QUFDSCx5RkFBOEQ7QUFBckQseUhBQWMsUUFBZ0I7Ozs7Ozs7Ozs7OztBQy9NdkM7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBRS9FLCtFQUEyRDtBQUMzRCw4RkFBZ0Q7QUFDaEQsc0dBQXNEO0FBQ3RELDJHQUF5RDtBQUN6RCxnRkFBMkM7QUFDM0Msa0ZBQXlDO0FBQ3pDLDhGQUFrRTtBQUtsRSxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDcEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUVuQixTQUFTLFdBQVc7SUFDaEIsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEUsMkRBQTJEO0lBQzNELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDcEIsc0NBQXNDO0lBQ3RDLEtBQUssSUFBSSxRQUFRLElBQUksWUFBWSxFQUFFO1FBQy9CLGVBQWU7UUFDZixJQUFJLE1BQU0sR0FBVyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QiwyREFBMkQ7UUFDM0Qsa0RBQWtEO1FBQ2xELEtBQUssSUFBSSxHQUFHLEdBQUMsS0FBSyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUN6QyxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDM0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ3REO1lBQ0QsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDdkIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzFCLEtBQUssSUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDeEMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFJLE1BQU0sY0FBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFFLENBQUM7aUJBQ2xGO2dCQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDdEQ7U0FDSjtRQUNELGFBQWE7UUFDYixLQUF3QixVQUFlLEVBQWYsV0FBTSxDQUFDLFFBQVEsRUFBZixjQUFlLEVBQWYsSUFBZSxFQUFFO1lBQXBDLElBQU0sU0FBUztZQUNoQixLQUFpQixVQUEyQixFQUEzQiw0QkFBMkIsRUFBM0IsY0FBMkIsRUFBM0IsSUFBMkIsRUFBRTtnQkFBekMsSUFBTSxFQUFFO2dCQUNULElBQUksVUFBVSxHQUFjLE9BQU8sU0FBUyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM3RixJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUM1QixLQUFpQixVQUFjLEVBQWQsT0FBRSxDQUFDLFdBQVcsRUFBZCxjQUFjLEVBQWQsSUFBYyxFQUFFO3dCQUE1QixJQUFNLEVBQUU7d0JBQ1QsSUFBSSxVQUFVLEdBQWMsT0FBTyxTQUFTLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7d0JBQ2hHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7NEJBQzdCLEVBQUUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFOzRCQUN6QixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQ0FDVixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0NBQ2IsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO2dDQUNsQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUs7Z0NBQ3RCLFlBQVksRUFBRSxTQUFTLENBQUMsWUFBWTs2QkFDdkMsQ0FBQzt5QkFDTDtxQkFDSjtpQkFDSjthQUNKO1NBQ0o7S0FDSjtBQUNMLENBQUM7QUFDRCxXQUFXLEVBQUUsQ0FBQztBQU9kO0lBaUJJO1FBaEJRLGVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBR3JDOztXQUVHO1FBQ0gsYUFBUSxHQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3hDOztXQUVHO1FBQ0gsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixpQkFBWSxHQUFpQyxFQUFFLENBQUM7UUFDaEQsZUFBVSxHQUEyRCxFQUFFLENBQUM7UUFDeEUscUJBQWdCLEdBQXFGLEVBQUUsQ0FBQztRQUN4RyxpQkFBWSxHQUFrRSxFQUFFLENBQUM7UUFHN0UsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQU0sRUFBRSxDQUFDO1FBRXhDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSx1QkFBVSxFQUFFLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUkseUJBQVcsRUFBRSxDQUFDLENBQUM7UUFFcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0IsS0FBaUIsVUFBWSxFQUFaLHdDQUFZLEVBQVosMEJBQVksRUFBWixJQUFZLEVBQUU7WUFBMUIsSUFBTSxFQUFFO1lBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN2QjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCw4QkFBWSxHQUFaLFVBQWEsU0FBb0I7UUFDN0IsSUFBSSxTQUFTLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkMsSUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQWlCLFVBQXFCLEVBQXJCLGNBQVMsQ0FBQyxXQUFXLEVBQXJCLGNBQXFCLEVBQXJCLElBQXFCLEVBQUU7WUFBbkMsSUFBTSxFQUFFO1lBQ1QsRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMxQixLQUFtQixVQUFRLEVBQVIsT0FBRSxDQUFDLEtBQUssRUFBUixjQUFRLEVBQVIsSUFBUSxFQUFFO2dCQUF4QixJQUFNLElBQUk7Z0JBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtvQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RCLDREQUE0RDtvQkFDNUQsc0RBQXNEO29CQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN0RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2xHLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ2hFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7aUJBQ2pFO2FBQ0o7U0FDSjtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsNEJBQVUsR0FBVixVQUFXLE1BQWM7UUFDckIsS0FBd0IsVUFBb0IsRUFBcEIsU0FBSSxDQUFDLGFBQWEsRUFBRSxFQUFwQixjQUFvQixFQUFwQixJQUFvQixFQUFFO1lBQXpDLElBQU0sU0FBUztZQUNoQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDcEIsS0FBaUIsVUFBcUIsRUFBckIsY0FBUyxDQUFDLFdBQVcsRUFBckIsY0FBcUIsRUFBckIsSUFBcUIsRUFBRTtnQkFBbkMsSUFBTSxFQUFFO2dCQUNULEtBQW1CLFVBQVEsRUFBUixPQUFFLENBQUMsS0FBSyxFQUFSLGNBQVEsRUFBUixJQUFRLEVBQUU7b0JBQXhCLElBQU0sSUFBSTtvQkFDWCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFO3dCQUN4QixPQUFPLEdBQUcsSUFBSSxDQUFDO3dCQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztxQkFDdkI7aUJBQ0o7YUFDSjtZQUNELElBQUksT0FBTyxFQUFFO2dCQUNULElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDaEM7U0FDSjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCw2QkFBVyxHQUFYLFVBQVksTUFBYztRQUN0QixLQUF3QixVQUFvQixFQUFwQixTQUFJLENBQUMsYUFBYSxFQUFFLEVBQXBCLGNBQW9CLEVBQXBCLElBQW9CLEVBQUU7WUFBekMsSUFBTSxTQUFTO1lBQ2hCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNwQixLQUFpQixVQUFxQixFQUFyQixjQUFTLENBQUMsV0FBVyxFQUFyQixjQUFxQixFQUFyQixJQUFxQixFQUFFO2dCQUFuQyxJQUFNLEVBQUU7Z0JBQ1QsS0FBbUIsVUFBUSxFQUFSLE9BQUUsQ0FBQyxLQUFLLEVBQVIsY0FBUSxFQUFSLElBQVEsRUFBRTtvQkFBeEIsSUFBTSxJQUFJO29CQUNYLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUU7d0JBQ3hCLE9BQU8sR0FBRyxJQUFJLENBQUM7d0JBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7cUJBQ3hCO2lCQUNKO2FBQ0o7WUFDRCxJQUFJLE9BQU8sRUFBRTtnQkFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ2hDO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQ0FBZSxHQUF2QixVQUF3QixXQUFtQjtRQUN2QyxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsbUJBQVMsSUFBSSxnQkFBUyxDQUFDLEVBQUUsS0FBSyxXQUFXLEVBQTVCLENBQTRCLENBQUMsQ0FBQztZQUNwRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCwrQkFBYSxHQUFiO1FBQ0ksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlDQUFlLEdBQWY7UUFDSSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLG1CQUFTLElBQUksZ0JBQVMsQ0FBQyxFQUFFLEVBQVosQ0FBWSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7T0FHRztJQUNILDRCQUFVLEdBQVYsVUFBVyxFQUFXO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsdUJBQUssR0FBTCxVQUFNLElBQXFCLEVBQUUsWUFBZ0M7UUFDekQsK0JBQStCO1FBQy9CLElBQUksT0FBTyxHQUFjLEVBQUUsQ0FBQztRQUU1QixnQkFBZ0I7UUFDaEIsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3ZDO2FBQUs7WUFDRixJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRTtnQkFDbEMsWUFBWSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDakM7WUFFRCxLQUFtQixVQUFZLEVBQVosNkJBQVksRUFBWiwwQkFBWSxFQUFaLElBQVksRUFBRTtnQkFBNUIsSUFBTSxJQUFJO2dCQUNYLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQzNCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDckQ7YUFDSjtTQUNKO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsd0JBQXdCO1FBQ3hCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQzthQUN2QixJQUFJLENBQUMsVUFBVSxNQUFNO1lBQ2xCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRTtZQUVmLEtBQXFCLFVBQWMsRUFBZCxXQUFNLENBQUMsT0FBTyxFQUFkLGNBQWMsRUFBZCxJQUFjLEVBQUU7Z0JBQWhDLElBQU0sTUFBTTtnQkFDYixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksUUFBUSxFQUFFO29CQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSTt3QkFDckQsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNoQztvQkFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUN6RjtpQkFDSjtnQkFDRCw2RUFBNkU7Z0JBQzdFLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUMsQ0FBQyxNQUFNLENBQUMsUUFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUMvRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBd0IsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2RixNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBd0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDMUI7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTSwwQkFBUSxHQUFoQixVQUFpQixLQUFlLEVBQUUsTUFBYztRQUMzQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sbUJBQVcsQ0FBQyxXQUFXLENBQUM7UUFDM0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxHQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzFGO1lBQ0QsS0FBbUIsVUFBSyxFQUFMLGVBQUssRUFBTCxtQkFBSyxFQUFMLElBQUssRUFBRTtnQkFBckIsSUFBTSxJQUFJO2dCQUNYLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRTtvQkFDaEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssbUJBQVcsQ0FBQyxTQUFTLEVBQUU7d0JBQ3hDLE1BQU0sR0FBRyxtQkFBVyxDQUFDLFNBQVMsQ0FBQztxQkFDbEM7eUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssbUJBQVcsQ0FBQyxjQUFjLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTt3QkFDdkUsTUFBTSxHQUFHLG1CQUFXLENBQUMsY0FBYyxDQUFDO3FCQUN2Qzt5QkFBTSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7d0JBQ3hCLE1BQU0sR0FBRyxtQkFBVyxDQUFDLFdBQVcsQ0FBQztxQkFDcEM7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELEdBQUMsTUFBTSxDQUFDLENBQUM7U0FDMUY7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU8sZ0NBQWMsR0FBdEIsVUFBdUIsS0FBZSxFQUFFLE1BQWMsRUFBRSxVQUFtQjtRQUN2RSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sbUJBQVcsQ0FBQyxXQUFXLENBQUM7UUFDM0MsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsR0FBQyxNQUFNLENBQUMsQ0FBQzthQUN6RjtvQ0FDVSxJQUFJO2dCQUNYLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRTtvQkFDaEIsSUFBTSxRQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsZ0JBQVMsVUFBVSxXQUFRLENBQUMsQ0FBQztvQkFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBSTt3QkFDbEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO3dCQUNqQixJQUFJLElBQUksS0FBSyxNQUFNOzRCQUNmLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7NkJBQzVCLElBQUksUUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7NEJBQ3RCLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBRS9CLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTs0QkFDaEIsSUFBSSxLQUFLLEtBQUssbUJBQVcsQ0FBQyxTQUFTLEVBQUU7Z0NBQ2pDLE1BQU0sR0FBRyxtQkFBVyxDQUFDLFNBQVMsQ0FBQzs2QkFDbEM7aUNBQU0sSUFBSSxLQUFLLEtBQUssbUJBQVcsQ0FBQyxjQUFjLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtnQ0FDaEUsTUFBTSxHQUFHLG1CQUFXLENBQUMsY0FBYyxDQUFDOzZCQUN2QztpQ0FBTSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0NBQ3hCLE1BQU0sR0FBRyxtQkFBVyxDQUFDLFdBQVcsQ0FBQzs2QkFDcEM7eUJBQ0o7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO3dCQUNqQixNQUFNLEdBQUcsbUJBQVcsQ0FBQyxXQUFXLENBQUM7cUJBQ3BDO2lCQUNKOztZQXZCTCxLQUFtQixVQUFLLEVBQUwsZUFBSyxFQUFMLG1CQUFLLEVBQUwsSUFBSztnQkFBbkIsSUFBTSxJQUFJO3dCQUFKLElBQUk7YUF3QmQ7U0FDSjtRQUNELElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxHQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVPLDZCQUFXLEdBQW5CLFVBQW9CLEtBQWUsRUFBRSxNQUFlO1FBQ2hELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDaEMsT0FBTywrQkFBa0IsQ0FBQyxLQUFLLENBQUM7U0FDbkM7UUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUNsQztRQUNELEtBQW1CLFVBQUssRUFBTCxlQUFLLEVBQUwsbUJBQUssRUFBTCxJQUFLLEVBQUU7WUFBckIsSUFBTSxJQUFJO1lBQ1gsSUFBSSxJQUFJLElBQUksTUFBTSxFQUFFO2dCQUNoQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN2QjtTQUNKO1FBQ0QsT0FBTywrQkFBa0IsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUNMLGNBQUM7QUFBRCxDQUFDO0FBblJZLDBCQUFPOzs7Ozs7Ozs7Ozs7QUNyRnBCOzs7Ozs7Ozs7OzsrRUFXK0U7OztBQUUvRSxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBRTFDLCtFQUE0RztBQUM1RywrRUFBMEQ7QUFFN0Msd0JBQWdCLEdBQVM7SUFDbEMsRUFBRSxFQUFFLGtCQUFrQjtJQUN0QixPQUFPLEVBQUUsaURBQWlEO0lBQzFELFFBQVEsRUFBRTtRQUNOLHdCQUF3QixFQUFFO1lBQ3RCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLGFBQWEsRUFBRSxnQkFBZ0I7U0FDbEM7S0FDSjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSx1QkFBdUI7WUFDaEMsTUFBTSxFQUFFLHVCQUF1QjtZQUMvQixnQkFBZ0IsRUFBRSx1QkFBdUI7U0FDNUM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSxnRkFBZ0Y7WUFDekYsTUFBTSxFQUFFLHdFQUF3RTtZQUNoRixnQkFBZ0IsRUFBRSxnRUFBZ0U7U0FDckY7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDeEYsR0FBRyxFQUFFLE9BQU87WUFDWixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ2pDLFlBQVksRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsbURBQW1EO1FBQ25ELElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hHLElBQU0sTUFBTSxHQUFHO1lBQ1gsWUFBWSxFQUFFO2dCQUNWLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUM7Z0JBQ2hDLElBQUksRUFBRSxPQUFPO2FBQ2hCO1NBQ0o7UUFFRCxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUFHLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLHVCQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDM0gsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULGdGQUFnRjtZQUNoRixtQ0FBbUM7WUFDbkMsSUFBSSxPQUFPLEdBQUcsdUJBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkQsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztnQkFDakMsT0FBTyxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUNoRSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQUUsTUFBTSxHQUFHLElBQUksQ0FBQztTQUM5RTtRQUNELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBYSxFQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUN6RUQ7Ozs7Ozs7Ozs7OytFQVcrRTs7O0FBRS9FLCtFQUFpRjtBQUNqRixnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBQzFDLCtFQUEwRDtBQUMxRCxtR0FBa0Q7QUFFckMsc0JBQWMsR0FBUztJQUNoQyxFQUFFLEVBQUUsZ0JBQWdCO0lBQ3BCLDBCQUEwQjtJQUMxQixPQUFPLEVBQUUsOEJBQThCO0lBQ3ZDLFFBQVEsRUFBRTtRQUNOLGtCQUFrQixFQUFFO1lBQ2hCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFFBQVEsRUFBRSxlQUFlO1NBQzVCO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUscUJBQXFCO1lBQzlCLE1BQU0sRUFBRSxxQkFBcUI7WUFDN0IsZUFBZSxFQUFFLHFCQUFxQjtTQUN6QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLDJEQUEyRDtZQUNwRSxNQUFNLEVBQUUsNENBQTRDO1lBQ3BELGVBQWUsRUFBRSxvRUFBb0U7U0FDeEY7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDeEYsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUN2QixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDeEMsQ0FBQztJQUNGLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZO1FBQ3BDLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFFbkQscURBQXFEO1FBQ3JELElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNuRixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsb0RBQW9EO1FBQ3BELHdGQUF3RjtRQUN4RixJQUFNLFlBQVksR0FBRyx5QkFBVyxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLElBQUksTUFBTSxHQUNOLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzFFLDBEQUEwRDtlQUN2RCx1QkFBVSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPLG9CQUFRLEVBQUMsZUFBZSxDQUFDLENBQUM7U0FDcEM7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdkVEOzs7Ozs7Ozs7OzsrRUFXK0U7OztBQUUvRSxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBQzFDLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFFN0MseUJBQWlCLEdBQVM7SUFDbkMsRUFBRSxFQUFFLG1CQUFtQjtJQUN2QixPQUFPLEVBQUUsWUFBWTtJQUNyQixRQUFRLEVBQUU7UUFDTixzQkFBc0IsRUFBRTtZQUNwQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUNyQjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxRQUFRLEVBQUUsd0JBQXdCO1lBQ2xDLFFBQVEsRUFBRSx3QkFBd0I7WUFDbEMsUUFBUSxFQUFFLHdCQUF3QjtZQUNsQyxRQUFRLEVBQUUsd0JBQXdCO1NBQ3JDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsa0ZBQWtGO1lBQzNGLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSw2RkFBNkY7WUFDdkcsUUFBUSxFQUFFLG1GQUFtRjtZQUM3RixRQUFRLEVBQUUsbUZBQW1GO1NBQ2hHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLEVBQUUsRUFBRSxDQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3hGLEdBQUcsRUFBRSxPQUFPO1lBQ1osS0FBSyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM1QixZQUFZLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQ3hDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELGVBQWU7UUFDZixJQUFJLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekQsMENBQTBDO1FBQzFDLElBQUksQ0FBQyx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNuRCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7YUFBTTtZQUNILElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakQsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNwRixPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7YUFDN0I7aUJBQU0sSUFBSSxDQUFDLHVCQUFVLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQ3ZELE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQzthQUM3QjtpQkFBTTtnQkFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7YUFDN0I7U0FDSjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDeEVEOzs7Ozs7Ozs7OzsrRUFXK0U7OztBQUUvRSwwRkFBNEM7QUFDNUMsdUZBQTBDO0FBQzFDLCtFQUE0RztBQUM1RywrRUFBMEQ7QUFFN0Msc0NBQThCLEdBQVM7SUFDaEQsRUFBRSxFQUFFLGdDQUFnQztJQUNwQyxPQUFPLEVBQUUsa0JBQWtCO0lBQzNCLFFBQVEsRUFBRTtRQUNOLDRCQUE0QixFQUFFO1lBQzFCLENBQUMsRUFBRSxpQ0FBaUM7WUFDcEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsYUFBYSxFQUFFLGFBQWE7U0FDL0I7S0FDSjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLENBQUMsRUFBRSxxQ0FBcUM7WUFDeEMsUUFBUSxFQUFFLHFDQUFxQztZQUMvQyxhQUFhLEVBQUUscUNBQXFDO1NBQ3ZEO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsNkdBQTZHO1lBQ3RILFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLGFBQWEsRUFBRSx5SEFBeUg7U0FDM0k7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDeEYsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUN2QixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDeEMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hELElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksaUJBQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3BDLE1BQU0sR0FBRyxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsSUFBSSxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDeEg7YUFDSjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFO2dCQUNuQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO2FBQ3REO1NBQ0o7UUFFRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBQyxhQUFhLENBQUMsQ0FBQztJQUN0RSxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ2pFRDs7Ozs7Ozs7Ozs7K0VBVytFOzs7QUFFL0UsZ0dBQWdEO0FBQ2hELHVGQUEwQztBQUMxQywrRUFBdUc7QUFDdkcsK0VBQTBEO0FBRTdDLHVCQUFlLEdBQVM7SUFDakMsRUFBRSxFQUFFLGlCQUFpQjtJQUNyQixPQUFPLEVBQUUsVUFBVTtJQUNuQixRQUFRLEVBQUU7UUFDTixvQkFBb0IsRUFBRTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUNyQjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLHNCQUFzQjtZQUMvQixRQUFRLEVBQUUsc0JBQXNCO1lBQ2hDLFFBQVEsRUFBRSxzQkFBc0I7U0FDbkM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSw4REFBOEQ7WUFDdkUsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLHdEQUF3RDtTQUNqRTtLQUNSO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxFQUFFLEVBQUUsQ0FBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN4RixHQUFHLEVBQUUsT0FBTztZQUNaLEtBQUssRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDNUIsWUFBWSxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUM1QyxDQUFDO0lBQ0UsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxlQUFlO1FBQ2YsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pELDBDQUEwQztRQUMxQyxJQUFJLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2xELE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUMzREQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBQzVDLHVGQUEwQztBQUMxQyxtR0FBa0Q7QUFFckMsa0NBQTBCLEdBQVM7SUFDNUMsRUFBRSxFQUFFLDRCQUE0QjtJQUNoQyxPQUFPLEVBQUUsK09BQStPO0lBQ3hQLElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSxpQ0FBaUM7WUFDekMseUJBQXlCLEVBQUUsaUNBQWlDO1lBQzVELCtCQUErQixFQUFFLGlDQUFpQztZQUNsRSxPQUFPLEVBQUUsaUNBQWlDO1NBQzdDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsZ0RBQWdEO1lBQ3hELHlCQUF5QixFQUFFLHdEQUF3RDtZQUNuRiwrQkFBK0IsRUFBRSx3REFBd0Q7WUFDekYsT0FBTyxFQUFFLDBEQUEwRDtTQUN0RTtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsY0FBYztZQUNuQyxjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1lBQ3ZDLFdBQVcsRUFBRSxDQUFDLHlCQUF5QixDQUFDO1NBQzNDO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDZixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7WUFDdkMsV0FBVyxFQUFFLENBQUMsK0JBQStCLENBQUM7U0FDakQsQ0FBQztJQUNGLEdBQUcsRUFBRSxDQUFDLEVBQUMsUUFBUSxFQUFFLEVBQUMsK0JBQStCLEVBQUUsTUFBTSxFQUFDLEVBQUMsQ0FBQztJQUM1RCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUVuRCxlQUFlO1FBQ2YsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpELElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN4RCx3RUFBd0U7UUFDeEUsSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxLQUFLO1lBQUUsT0FBTztRQUVyRCxtREFBbUQ7UUFDbkQsSUFBSSxRQUFRLEtBQUssT0FBTztlQUNqQixXQUFXLENBQUMsaUJBQWlCLElBQUksV0FBVyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxTQUFTO2VBQ25HLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUMzRyxPQUFPLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUIsSUFBTSxZQUFZLEdBQUcsbUJBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RCxJQUFNLGVBQWUsR0FBRyxtQkFBUSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JFLElBQUksZUFBZSxJQUFJLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9ELElBQU0sb0JBQW9CLEdBQUcsbUJBQVEsQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRSxJQUFJLG9CQUFvQixJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFekUsSUFBSSxJQUFJLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFakQsSUFBTSxTQUFTLEdBQUcseUJBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDckUsSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxPQUFPO2dCQUNsQyxPQUFPLG9CQUFRLEVBQUMsK0JBQStCLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakcsT0FBTyxvQkFBUSxFQUFDLHlCQUF5QixFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQzFGO1FBQ0QsT0FBTyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdEZEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELGdHQUFnRDtBQUVuQyw0Q0FBb0MsR0FBUztJQUN0RCxFQUFFLEVBQUUsc0NBQXNDO0lBQzFDLE9BQU8sRUFBRSw4QkFBOEI7SUFDdkMsUUFBUSxFQUFFO1FBQ04sNkNBQTZDLEVBQUU7WUFDM0MsTUFBTSxFQUFFLE1BQU07WUFDZCxRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLDJDQUEyQztZQUNuRCxRQUFRLEVBQUUsMkNBQTJDO1lBQ3JELE9BQU8sRUFBRSwyQ0FBMkM7U0FDdkQ7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLFFBQVEsRUFBRSxnRkFBZ0Y7WUFDMUYsT0FBTyxFQUFFLG1FQUFtRTtTQUMvRTtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQzFDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWxELCtCQUErQjtRQUMvQixJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRTtZQUNqRyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsOEZBQThGO1FBQzlGLHVIQUF1SDtRQUN2SCxzR0FBc0c7UUFDdEcsZ0lBQWdJO1FBQ2hJLElBQUksdUJBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDeEMsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELDBEQUEwRDtRQUMxRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNyRSxPQUFPO1FBRVgsdUVBQXVFO1FBQ3ZFLE1BQU0sR0FBRyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU1Qyx5R0FBeUc7UUFDekcsSUFBSSxDQUFDLE1BQU07WUFDUCxNQUFNLEdBQUcsdUJBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0QsNkJBQTZCO1FBQzdCLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6Qix5REFBeUQ7UUFDekQsSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFeEYsMkdBQTJHO1FBQzNHLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0U7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDMUZEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsNElBQTRFO0FBQzVFLHVGQUEwQztBQUMxQywyRkFBK0M7QUFFbEMsbUNBQTJCLEdBQVM7SUFDN0MsRUFBRSxFQUFFLDZCQUE2QjtJQUNqQyxPQUFPLEVBQUUsOEJBQThCO0lBQ3ZDLFFBQVEsRUFBRTtRQUNOLDRCQUE0QixFQUFFO1lBQzFCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLHFCQUFxQjtTQUN4QjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGtDQUFrQztZQUM1QyxRQUFRLEVBQUUsa0NBQWtDO1lBQzVDLFFBQVEsRUFBRSxrQ0FBa0M7WUFDNUMsUUFBUSxFQUFFLGtDQUFrQztZQUM1QyxnREFBZ0Q7WUFDaEQsT0FBTyxFQUFFLGtDQUFrQztTQUM5QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLCtDQUErQztZQUN6RCxRQUFRLEVBQUUsK0RBQStEO1lBQ3pFLFFBQVEsRUFBRSxtR0FBbUc7WUFDN0csdUhBQXVIO1lBQ3ZILE9BQU8sRUFBRSw4R0FBOEc7U0FDMUg7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxzRUFBc0U7UUFDdEUsSUFBSSxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxhQUFhLEdBQUcsbUJBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUNwRiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQy9DLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtRQUVELElBQUksVUFBVSxHQUFHLHVCQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsVUFBVSxJQUFJLGlCQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsRUFBRTtZQUM3RCx5RUFBeUU7WUFDekUsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwQyx1REFBdUQ7WUFDdkQsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsNkZBQTZGO1FBQzdGLDZCQUE2QjtRQUM3QixJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbEMsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBRWQsc0VBQXNFO1FBQ3RFLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN2QyxJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLElBQUksU0FBUyxHQUFHLHVCQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxTQUFTLElBQUksQ0FBQyxpQkFBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDMUYsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM3QjthQUNKO1NBQ0o7UUFFRCw4RkFBOEY7UUFDOUYsNkZBQTZGO1FBQzdGLG1HQUFtRztRQUNuRyxrRkFBa0Y7UUFDbEYsRUFBRTtRQUNGLElBQUksbUJBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNsRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxjQUFjLEdBQUcsdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1QyxJQUFJLGNBQWMsR0FBRyx1QkFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLElBQUksY0FBYyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ3pHLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztpQkFDN0I7Z0JBQ0QsSUFBSSxjQUFjLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUMxQyxJQUFJLFFBQVEsR0FBRyx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3ZHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUN0QyxJQUFJLFNBQVMsR0FBRyx1QkFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQy9ELElBQUksU0FBUyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7NEJBQzFGLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQzt5QkFDN0I7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsbUhBQW1IO1FBQ25ILHNCQUFzQjtRQUN0QixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDWixPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3ZJRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELDZGQUE4QztBQUVqQyxxQ0FBNkIsR0FBUztJQUMvQyxFQUFFLEVBQUUsK0JBQStCO0lBQ25DLE9BQU8sRUFBRSxrQkFBa0I7SUFDM0IsUUFBUSxFQUFFO1FBQ04sdUNBQXVDLEVBQUU7WUFDckMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FBQztLQUMxQjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxvQ0FBb0M7WUFDOUMsUUFBUSxFQUFFLG9DQUFvQztZQUM5QyxPQUFPLEVBQUUsb0NBQW9DO1NBQ2hEO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsdUVBQXVFO1lBQ2pGLE9BQU8sRUFBRSw0RkFBNEY7U0FDeEc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxxRUFBcUU7UUFDckUseUNBQXlDO1FBQ3pDLElBQUksU0FBUyxHQUFHLHVCQUFVLENBQUMsdUJBQXVCLENBQzlDLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLGFBQWEsRUFDYixJQUFJLEVBQ0osSUFBSSxDQUNQLENBQUM7UUFDRixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLEtBQUssR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FDMUIsV0FBVyxDQUFDLGFBQWEsRUFDekIsK0JBQStCLEVBQy9CLElBQUksQ0FDUCxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLEtBQUssR0FBRyxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLHFCQUFTLENBQUMsUUFBUSxDQUNkLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLCtCQUErQixFQUMvQixLQUFLLENBQ1IsQ0FBQztTQUNMO1FBQ0QsSUFBSSxPQUFPLEdBQUcsbUJBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsSUFBSSxNQUFNLEdBQ04sT0FBTyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRW5FLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdEZEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBRTFELG1HQUFrRDtBQUVsRCx1RkFBMEM7QUFFN0IsaUNBQXlCLEdBQVM7SUFDM0MsRUFBRSxFQUFFLDJCQUEyQjtJQUMvQixPQUFPLEVBQUUsa0JBQWtCO0lBQzNCLFFBQVEsRUFBRTtRQUNOLG1DQUFtQyxFQUFFO1lBQ2pDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQUM7S0FDMUI7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsZ0NBQWdDO1lBQzFDLFFBQVEsRUFBRSxnQ0FBZ0M7WUFDMUMsT0FBTyxFQUFFLGdDQUFnQztTQUM1QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLHlEQUF5RDtZQUNuRSxPQUFPLEVBQUUscUZBQXFGO1NBQ2pHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpELElBQU0sSUFBSSxHQUFHLHlCQUFXLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUM1REQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBQzVDLGdHQUFnRDtBQUNoRCw2RkFBOEM7QUFFakMsaUNBQXlCLEdBQVM7SUFDM0MsRUFBRSxFQUFFLDJCQUEyQjtJQUMvQixPQUFPLEVBQUUsY0FBYztJQUN2QixRQUFRLEVBQUU7UUFDTix3Q0FBd0MsRUFBRTtZQUN0QyxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGdDQUFnQztZQUMxQyxRQUFRLEVBQUUsZ0NBQWdDO1lBQzFDLE9BQU8sRUFBRSxnQ0FBZ0M7U0FDNUM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSxtRUFBbUU7WUFDN0UsT0FBTyxFQUFFLHdGQUF3RjtTQUNwRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELHFFQUFxRTtRQUNyRSx5Q0FBeUM7UUFDekMsSUFBSSxTQUFTLEdBQUcsdUJBQVUsQ0FBQyx1QkFBdUIsQ0FDOUMsV0FBVyxDQUFDLGFBQWEsRUFDekIsU0FBUyxFQUNULElBQUksRUFDSixJQUFJLENBQ1AsQ0FBQztRQUNGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksS0FBSyxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUMxQixXQUFXLENBQUMsYUFBYSxFQUN6QiwyQkFBMkIsRUFDM0IsSUFBSSxDQUNQLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsS0FBSyxHQUFHLG1CQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0MscUJBQVMsQ0FBQyxRQUFRLENBQ2QsV0FBVyxDQUFDLGFBQWEsRUFDekIsMkJBQTJCLEVBQzNCLEtBQUssQ0FDUixDQUFDO1NBQ0w7UUFDRCxJQUFJLE9BQU8sR0FBRyxtQkFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLE1BQU0sR0FDTixPQUFPLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRSx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sb0JBQVEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3RGRDs7Ozs7Ozs7Ozs7K0VBVytFOzs7QUFFL0UsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCxxSEFBZ0U7QUFDaEUsMEZBQTRDO0FBRS9CLDhCQUFzQixHQUFTO0lBQ3hDLEVBQUUsRUFBRSx3QkFBd0I7SUFDNUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsUUFBUSxFQUFFO1FBQ04sd0JBQXdCLEVBQUU7WUFDdEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FDckI7S0FDSjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSw2QkFBNkI7WUFDdEMsUUFBUSxFQUFFLDZCQUE2QjtZQUN2QyxRQUFRLEVBQUUsNkJBQTZCO1NBQzFDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsc0RBQXNEO1lBQy9ELFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSw4RkFBOEY7U0FDM0c7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDeEYsR0FBRyxFQUFFLE9BQU87WUFDWixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDeEMsQ0FBQztJQUNGLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBRS9DLCtEQUErRDtRQUMvRCxrREFBa0Q7UUFFbEQsSUFBSSxpQkFBaUIsRUFBRTtZQUNuQixJQUFJLGlCQUFpQixHQUFHLGlDQUFlLENBQUMsaUJBQWlCLENBQUM7WUFDMUQsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7WUFDMUIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsUUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRSxJQUFJLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLElBQUksbUJBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQUU7b0JBQ3hELGdCQUFnQixFQUFFLENBQUM7b0JBQ25CLDZDQUE2QztvQkFDN0Msd0RBQXdEO29CQUN4RCxJQUFJLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLDRDQUE0Qzt3QkFDMUQseUNBQXlDO3dCQUN6QyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7NEJBQzlCLGdCQUFnQixHQUFHLFFBQVEsQ0FBQzt5QkFDL0I7NkJBQU07NEJBQ0gsZ0JBQWdCLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQzt5QkFDekQ7cUJBQ0o7aUJBQ0o7YUFDSjtZQUNELElBQUksZ0JBQWdCLElBQUksQ0FBQyxFQUFFO2dCQUN2QixPQUFPLElBQUksQ0FBQzthQUNmO2lCQUFNLElBQUksZ0JBQWdCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtnQkFDckMsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3JGO2lCQUFNO2dCQUNILHFCQUFxQjtnQkFDckIsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzdCO1NBQ0o7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxvRUFBb0U7UUFDcEUsa0RBQWtEO1FBQ2xELHFCQUFxQjtJQUN6QixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzNGRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQTZGO0FBQzdGLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBRW5DLCtCQUF1QixHQUFTO0lBQ3pDLEVBQUUsRUFBRSx5QkFBeUI7SUFDN0IsT0FBTyxFQUFFLHFIQUFxSDtVQUNwSCw0R0FBNEc7VUFDNUcsdUJBQXVCO0lBQ2pDLElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLDBDQUEwQztZQUMxQyxlQUFlLEVBQUUsOEJBQThCO1lBQy9DLE9BQU8sRUFBRSw4QkFBOEI7U0FDMUM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLHNGQUFzRjtZQUN0RixlQUFlLEVBQUUseUZBQXlGO1lBQzFHLE9BQU8sRUFBRSwyRUFBMkU7U0FDdkY7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUVuRCxpRkFBaUY7UUFDakYsSUFBSSxpQkFBaUIsR0FBRyxtQkFBUSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksaUJBQWlCLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDakQsT0FBTyxJQUFJLENBQUM7UUFFaEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxjQUFjLEdBQUcsbUJBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsY0FBYyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUksQ0FBQztZQUM3QyxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLGtCQUFrQixHQUFHLG1CQUFRLENBQUMsZ0NBQWdDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMsZUFBZSxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUcsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxRCx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUMzRjtRQUVELElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2QsT0FBTyxHQUFHLENBQUM7UUFFZixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3JFRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQTZGO0FBQzdGLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFFL0IsaUNBQXlCLEdBQVM7SUFDM0MsRUFBRSxFQUFFLDJCQUEyQjtJQUMvQixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCw0Q0FBNEM7WUFDNUMsZ0JBQWdCLEVBQUUsZ0NBQWdDO1lBQ2xELGdCQUFnQixFQUFFLGdDQUFnQztZQUNsRCxnQkFBZ0IsRUFBRSxnQ0FBZ0M7WUFDbEQsT0FBTyxFQUFFLGdDQUFnQztTQUM1QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wscUVBQXFFO1lBQ3JFLGdCQUFnQixFQUFFLCtEQUErRDtZQUNqRixnQkFBZ0IsRUFBRSxzRUFBc0U7WUFDeEYsZ0JBQWdCLEVBQUUsMkZBQTJGO1lBQzdHLE9BQU8sRUFBRSxxREFBcUQ7U0FDakU7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLENBQUM7WUFDckQsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2YsT0FBTyxFQUFFLG1CQUFXLENBQUMsY0FBYztZQUNuQyxjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBRW5ELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQU0sZUFBZSxHQUFHLG1CQUFRLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckUsSUFBSSxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUMzQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEU7UUFFRCxJQUFNLG9CQUFvQixHQUFHLG1CQUFRLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0UsSUFBSSxvQkFBb0IsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xELDBDQUEwQztnQkFDMUMsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSztvQkFDdEMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBUSxFQUFDLGdCQUFnQixFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOztvQkFFMUUsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBUSxFQUFDLGdCQUFnQixFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvRztTQUNKO1FBRUQsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDZCxPQUFPLEdBQUcsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdEVEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQscUhBQWdFO0FBQ2hFLHVGQUEwQztBQUU3Qiw2QkFBcUIsR0FBUztJQUN2QyxFQUFFLEVBQUUsdUJBQXVCO0lBQzNCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFlBQVksRUFBRSxDQUFDLG1CQUFtQixDQUFDO0lBQ25DLFFBQVEsRUFBRTtRQUNOLDZCQUE2QixFQUFFO1lBQzNCLE1BQU0sRUFBRSxNQUFNO1lBQ2Qsc0JBQXNCLEVBQUUsc0JBQXNCO1NBQ2pEO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsNEJBQTRCO1lBQ3BDLHNCQUFzQixFQUFFLDRCQUE0QjtZQUNwRCxPQUFPLEVBQUUsNEJBQTRCO1NBQ3hDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsYUFBYTtZQUNyQixzQkFBc0IsRUFBRSxnREFBZ0Q7WUFDeEUsT0FBTyxFQUFFLHdFQUF3RTtTQUNwRjtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQzFDLENBQUM7SUFDRixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDZixHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUVuRCx5Q0FBeUM7UUFDekMsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUN2QyxPQUFPO1FBRVgsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLGNBQWMsR0FBRyxpQ0FBZSxDQUFDLGNBQWMsQ0FBQztRQUNwRCxJQUFJLFlBQVksR0FBRyx1QkFBVSxDQUFDLFlBQVksQ0FBQztRQUMzQyxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUV6QixJQUFJLElBQUksR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksbUJBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ3ZGLElBQUksaUJBQWlCLEdBQUcsbUJBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDOUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsUUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRSxJQUFJLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO29CQUN0QyxnQkFBZ0IsRUFBRSxDQUFDO29CQUNuQixJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1RixJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQzt3QkFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JFO3FCQUFNLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksaUJBQWlCLEVBQUU7b0JBQ2xELElBQUksQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUU7d0JBQ3JFLGdCQUFnQixFQUFFLENBQUM7d0JBQ25CLElBQUksU0FBUyxHQUFHLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNwRixJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQzs0QkFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3FCQUM3RDtpQkFDSjtxQkFBTSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsRUFBRTtvQkFDaEQsSUFBSSxDQUFDLElBQUksSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFO3dCQUMxRSxnQkFBZ0IsRUFBRSxDQUFDO3dCQUNuQixJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO3dCQUN4RixJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQzs0QkFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7cUJBQ2pFO2lCQUNKO2FBQ0o7U0FDSjtRQUVELElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLElBQUksV0FBVyxHQUFHLG1CQUFRLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0QsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxpQkFBaUIsR0FBRyxtQkFBUSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDcEcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsUUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRSxJQUFJLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsSUFBSSxTQUFTLElBQUksY0FBYyxJQUFJLFNBQVMsSUFBSSxlQUFlO29CQUMzRCxTQUFTLElBQUksZUFBZSxJQUFJLFNBQVMsSUFBSSxrQkFBa0I7b0JBQy9ELFNBQVMsSUFBSSxZQUFZLEVBQUU7b0JBQzNCLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRTt3QkFDdEMsZ0JBQWdCLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxTQUFTLEdBQUcsdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQ2pGLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFOzRCQUMzRCxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3lCQUMvQjtxQkFDSjtpQkFDSjthQUNKO1NBQ0o7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLDhFQUE4RTtRQUM5RSxJQUFJLGdCQUFnQixJQUFJLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixPQUFPLG9CQUFRLEVBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDbkQ7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDMUhEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUUvQixnQ0FBd0IsR0FBUztJQUMxQyxFQUFFLEVBQUUsMEJBQTBCO0lBQzlCLE9BQU8sRUFBRSxxSEFBcUg7VUFDcEgsNEdBQTRHO1VBQzVHLHVCQUF1QjtJQUNqQyxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsK0JBQStCO1lBQ3ZDLGdCQUFnQixFQUFFLCtCQUErQjtZQUNqRCxPQUFPLEVBQUUsK0JBQStCO1NBQzNDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUseUVBQXlFO1lBQ2pGLGdCQUFnQixFQUFFLHlFQUF5RTtZQUMzRixPQUFPLEVBQUUsK0VBQStFO1NBQzNGO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFFbkQsaUZBQWlGO1FBQ2pGLElBQUksaUJBQWlCLEdBQUcsbUJBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RSxJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2pELE9BQU8sSUFBSSxDQUFDO1FBRWhCLHlEQUF5RDtRQUN6RCxJQUFJLGtCQUFrQixHQUFHLG1CQUFRLENBQUMsZ0NBQWdDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEYsSUFBSSxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNuRCxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLGFBQWEsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQzNDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxhQUFhLEVBQUU7WUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUQsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxTQUFTLEtBQUssRUFBRTtvQkFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN2QyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU87b0JBQ3BDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDOztvQkFFbkQsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUM7YUFDMUQ7U0FDSjtRQUNELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztnQ0FDSixDQUFDO1lBQ04sSUFBTSxvQkFBb0IsR0FBRyxtQkFBUSxDQUFDLHFDQUFxQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDcEgsSUFBSSxvQkFBb0IsS0FBSyxJQUFJO2tDQUFXO1lBQzVDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxjQUFJO2dCQUM3QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxNQUFNLEVBQUUsRUFBRSxNQUFNO29CQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDOUI7cUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxFQUFFLEVBQUUsUUFBUTtvQkFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBUSxFQUFDLGdCQUFnQixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUU7WUFDTCxDQUFDLENBQUMsQ0FBQzs7UUFUUCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7b0JBQWhDLENBQUM7U0FVVDtRQUNELElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2QsT0FBTyxHQUFHLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3RGRDs7Ozs7Ozs7Ozs7K0VBVytFOzs7QUFFL0UscUhBQWdFO0FBQ2hFLDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUU3QywrQkFBdUIsR0FBUztJQUN6QyxFQUFFLEVBQUUseUJBQXlCO0lBQzdCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFlBQVksRUFBRSxDQUFDLG1CQUFtQixDQUFDO0lBQ25DLFFBQVEsRUFBRTtRQUNOLDZCQUE2QixFQUFFO1lBQzNCLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLFFBQVEsRUFBRSxjQUFjO1NBQzNCO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsOEJBQThCO1lBQ3ZDLE1BQU0sRUFBRSw4QkFBOEI7WUFDdEMsY0FBYyxFQUFFLDhCQUE4QjtTQUNqRDtLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLHFFQUFxRTtZQUM5RSxNQUFNLEVBQUUsbUVBQW1FO1lBQzNFLGNBQWMsRUFBRSw2RUFBNkU7U0FDaEc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDeEYsR0FBRyxFQUFFLE9BQU87WUFDWixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDeEMsQ0FBQztJQUNGLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLFdBQVcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzlCLElBQUksY0FBYyxHQUFHLGlDQUFlLENBQUMsY0FBYyxDQUFDO1FBQ3BELGdFQUFnRTtRQUNoRSwyREFBMkQ7UUFDM0QsSUFBSSxZQUFZLEdBQUcsdUJBQVUsQ0FBQyxZQUFZLENBQUM7UUFDM0MsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLElBQUksV0FBVyxHQUFHLG1CQUFRLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0QsSUFBSSxJQUFJLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBRWxCLElBQUksaUJBQWlCLEdBQUcsbUJBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLEtBQUssSUFBSSxFQUFFO1lBQ3BELElBQUksZ0JBQWdCLEdBQUcsbUJBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3pGLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQUUsU0FBUztnQkFDL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDbEQsZ0ZBQWdGO29CQUNoRixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixFQUFFO3dCQUMzQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDLEVBQUU7NEJBQ3RFLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdkMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO3lCQUM3QjtxQkFDSjt5QkFBTSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsRUFBRTt3QkFDaEQsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxDQUFDLEVBQUU7NEJBQzNFLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdkMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO3lCQUM3QjtxQkFDSjt5QkFBTSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksVUFBVSxFQUFFO3dCQUN0RSxpSUFBaUk7cUJBQ3BJO3lCQUFNO3dCQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO3FCQUM3QjtpQkFDSjthQUNKO1lBQ0QsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7Z0JBQzVCLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUI7U0FDSjtRQUVELElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsMENBQTBDO1FBQzNHLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxJQUFJLFFBQVEsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sb0JBQVEsRUFBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDekdEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQscUhBQWdFO0FBRW5ELGtDQUEwQixHQUFTO0lBQzVDLEVBQUUsRUFBRSw0QkFBNEI7SUFDaEMsT0FBTyxFQUFFLE9BQU87SUFDaEIsWUFBWSxFQUFFLENBQUMsd0JBQXdCLENBQUM7SUFDeEMsUUFBUSxFQUFFO1FBQ04sNkJBQTZCLEVBQUU7WUFDM0IsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FDckI7S0FDSjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSxpQ0FBaUM7WUFDMUMsUUFBUSxFQUFFLGlDQUFpQztZQUMzQyxRQUFRLEVBQUUsaUNBQWlDO1NBQzlDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsb0NBQW9DO1lBQzdDLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSwrRUFBK0U7U0FDNUY7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLFFBQVE7SUFDYixHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxJQUFJLFFBQVEsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksV0FBVyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDOUIsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLGlCQUFpQixHQUFHLGlDQUFlLENBQUMsaUJBQWlCLENBQUM7UUFDMUQsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQy9DLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBRTdCLElBQUksaUJBQWlCLEVBQUU7WUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsUUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRSxJQUFJLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLElBQUksbUJBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQUU7b0JBQ3hELElBQUksU0FBUyxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM1RSxvQkFBb0IsRUFBRSxDQUFDO29CQUN2QixJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFO3dCQUMvQixJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFOzRCQUMzQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dDQUN0RSxrQ0FBa0M7NkJBQ3JDO2lDQUFNO2dDQUNILG1GQUFtRjtnQ0FDbkYsOERBQThEO2dDQUM5RCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssMkNBQTJDLEVBQUU7b0NBQ2hFLElBQUksVUFBVSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0NBQ2xFLGdFQUFnRTtvQ0FDaEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dDQUNyRCxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3Q0FDekQsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3Q0FDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7cUNBQ2pEO3lDQUFNO3dDQUNILElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQzt3Q0FDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs0Q0FDeEMsK0RBQStEOzRDQUMvRCxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnREFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUU7b0RBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7b0RBQ3RCLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aURBQzlCO2dEQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0RBQzdCLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDOzZDQUNqRDt5Q0FDSjtxQ0FDSjtpQ0FDSjtxQ0FBTTtvQ0FDSCxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQ0FDekQsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQ0FDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7aUNBQ2pEOzZCQUNKO3lCQUNKO3FCQUNKO3lCQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxzQ0FBc0MsRUFBRTt3QkFDakcsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMvQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUU7NEJBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ3pCLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQzlCO3FCQUNKO3lCQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSwwQ0FBMEMsRUFBRTt3QkFDcEcsSUFBSSxJQUFJLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNqQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDYixRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUN6QixXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUM5QjtxQkFDSjt5QkFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSwwQ0FBMEMsQ0FBQyxFQUFFO3dCQUN0RyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQzFDLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFOzRCQUNyQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUN6QixXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3lCQUM5QjtxQkFDSjt5QkFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSx5Q0FBeUMsQ0FBQyxFQUFFO3FCQUN4Rzt5QkFBTTt3QkFDSCxvQkFBb0IsRUFBRSxDQUFDO3FCQUMxQjtpQkFDSjthQUNKO1NBQ0o7UUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELHdDQUF3QztRQUN4Qyw4RUFBOEU7UUFDOUUsSUFBSSxvQkFBb0IsSUFBSSxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNyQzthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUM3SUQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBQzVDLGdHQUFnRDtBQUNoRCw2RkFBOEM7QUFFakMsZ0NBQXdCLEdBQVM7SUFDMUMsRUFBRSxFQUFFLDBCQUEwQjtJQUM5QixPQUFPLEVBQUUsYUFBYTtJQUN0QixRQUFRLEVBQUU7UUFDTiwyQ0FBMkMsRUFBRTtZQUN6QyxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLCtCQUErQjtZQUN6QyxRQUFRLEVBQUUsK0JBQStCO1lBQ3pDLE9BQU8sRUFBRSwrQkFBK0I7U0FDM0M7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSxrRUFBa0U7WUFDNUUsT0FBTyxFQUFFLHVGQUF1RjtTQUNuRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELHFFQUFxRTtRQUNyRSx5Q0FBeUM7UUFDekMsSUFBSSxTQUFTLEdBQUcsdUJBQVUsQ0FBQyx1QkFBdUIsQ0FDOUMsV0FBVyxDQUFDLGFBQWEsRUFDekIsUUFBUSxFQUNSLElBQUksRUFDSixJQUFJLENBQ1AsQ0FBQztRQUNGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksS0FBSyxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUMxQixXQUFXLENBQUMsYUFBYSxFQUN6QiwwQkFBMEIsRUFDMUIsSUFBSSxDQUNQLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsS0FBSyxHQUFHLG1CQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0MscUJBQVMsQ0FBQyxRQUFRLENBQ2QsV0FBVyxDQUFDLGFBQWEsRUFDekIsMEJBQTBCLEVBQzFCLEtBQUssQ0FDUixDQUFDO1NBQ0w7UUFDRCxJQUFJLE9BQU8sR0FBRyxtQkFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLE1BQU0sR0FDTixPQUFPLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFbkUsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUN4QzthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUN0RkQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBRS9CLDBCQUFrQixHQUFTO0lBQ3BDLEVBQUUsRUFBRSxvQkFBb0I7SUFDeEIsT0FBTyxFQUFFLHlCQUF5QjtJQUNsQyxRQUFRLEVBQUU7UUFDTix5Q0FBeUMsRUFBRTtZQUN2QyxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLHlCQUF5QjtZQUNuQyxRQUFRLEVBQUUseUJBQXlCO1lBQ25DLE9BQU8sRUFBRSx5QkFBeUI7U0FDckM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSwwREFBMEQ7WUFDcEUsT0FBTyxFQUFFLG9GQUFvRjtTQUNoRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksQ0FBQyxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNyRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxNQUFNLEdBQ04sbUJBQVEsQ0FBQyx3QkFBd0IsQ0FDN0IsV0FBVyxFQUNYLFFBQVEsRUFDUixJQUFJLEVBQ0osSUFBSSxDQUNQLEtBQUssSUFBSSxDQUFDO1FBQ2YscUVBQXFFO1FBQ3JFLElBQUksTUFBTSxFQUFFO1lBQ1IsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ2xFRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELHFIQUFnRTtBQUNoRSx1RkFBMEM7QUFFN0IsMkJBQW1CLEdBQVM7SUFDckMsRUFBRSxFQUFFLHFCQUFxQjtJQUN6QixPQUFPLEVBQUUsYUFBYTtJQUN0QixZQUFZLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztJQUNuQyxRQUFRLEVBQUU7UUFDTixnQ0FBZ0MsRUFBRTtZQUM5QixNQUFNLEVBQUUsTUFBTTtZQUNkLG9CQUFvQixFQUFFLG9CQUFvQjtTQUFDO0tBQ2xEO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLDBCQUEwQjtZQUNsQyxvQkFBb0IsRUFBRSwwQkFBMEI7WUFDaEQsT0FBTyxFQUFFLDBCQUEwQjtTQUN0QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLGFBQWE7WUFDckIsb0JBQW9CLEVBQUUsK0RBQStEO1lBQ3JGLE9BQU8sRUFBRSw2RUFBNkU7U0FDekY7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQW1CLENBQUM7UUFFdkQscURBQXFEO1FBQ3JELElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDakYsT0FBTztRQUVYLHFFQUFxRTtRQUNyRSxJQUFJLG1CQUFRLENBQUMsa0NBQWtDLENBQUMsV0FBVyxDQUFDLElBQUksbUJBQVEsQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUM7WUFDN0csT0FBTztRQUVYLGtDQUFrQztRQUNsQyxJQUFJLG1CQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7WUFDN0csT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELHNHQUFzRztRQUN0RyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRTtZQUNqRyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsNkZBQTZGO1FBQzdGLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxVQUFVO1lBQ2pELE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9FLDRGQUE0RjtRQUM1Rix5TEFBeUw7UUFDekwsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM1Qjs7O2NBR0U7WUFDRixJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQywyQkFBb0IsRUFBRSx3REFBOEMsRUFBRSw2QkFBMEIsQ0FBQyxDQUFDO1lBQ3ZKLElBQU0sWUFBVSxHQUFHLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEcsSUFBSSxJQUFJLElBQUksdUJBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBQyxJQUFFLG1CQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUF0QixDQUFzQixDQUFDO2dCQUN4RyxPQUFPLElBQUksQ0FBQztTQUNuQjtRQUVELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ3BDLElBQUksWUFBWSxHQUFHLHVCQUFVLENBQUMsWUFBWSxDQUFDO1FBQzNDLElBQUksV0FBVyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDOUIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxJQUFJLGlDQUFlLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDL0MsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzRyxJQUFJLFFBQVEsSUFBSSxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLHVCQUF1QixDQUFDLElBQUksQ0FBQyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDbEgsSUFBSSxXQUFXLEdBQUcsaUNBQWUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO29CQUN2RSxJQUFJLFdBQVcsRUFBRTt3QkFDYixPQUFPLEdBQUcsSUFBSSxDQUFDO3dCQUNmLE1BQU0sR0FBRyxLQUFLLENBQUM7d0JBQ2YsSUFBSSxFQUFFLEdBQUcsZ0JBQWdCLENBQUM7d0JBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUN6QyxFQUFFLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7eUJBQzlDO3dCQUNELEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFDMUMsSUFBSSxXQUFXLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLHVCQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUNsSCxJQUFJLENBQUMsR0FBWSxXQUFXLENBQUMsV0FBVyxFQUFhLENBQUM7d0JBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFOzRCQUNqQixrSEFBa0g7NEJBQ2xILFVBQVU7NEJBQ1YsbUhBQW1IOzRCQUNuSCxtSEFBbUg7NEJBQ25ILG1GQUFtRjs0QkFDbkYsRUFBRTs0QkFDRixzSEFBc0g7NEJBQ3RILDRCQUE0Qjs0QkFDNUIsSUFBSSx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUN6QyxDQUFDLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBYSxDQUFDO2dDQUN6QyxTQUFTOzZCQUNaOzRCQUVELE1BQU0sR0FBRyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFFbEMsMEhBQTBIOzRCQUMxSCxJQUFJLENBQUMsTUFBTSxFQUFFO2dDQUNULElBQUksR0FBRyxHQUFHLGVBQWUsQ0FBQztnQ0FDMUIsSUFBSSxZQUFZLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLHVCQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO2dDQUMxRyxJQUFJLEVBQUUsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7Z0NBQ3BDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO29DQUNsQixrSEFBa0g7b0NBQ2xILFVBQVU7b0NBQ1YsbUhBQW1IO29DQUNuSCxtSEFBbUg7b0NBQ25ILG1GQUFtRjtvQ0FDbkYsRUFBRTtvQ0FDRixzSEFBc0g7b0NBQ3RILDRCQUE0QjtvQ0FDNUIsSUFBSSx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxFQUFFO3dDQUMxQyxFQUFFLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dDQUNoQyxTQUFTO3FDQUNaO29DQUNELE1BQU0sR0FBRyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDbEMsRUFBRSxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQ0FDbkM7NkJBQ0o7NEJBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQ0FDVCxXQUFXLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ3ZELFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDOzZCQUN2Qzs0QkFDRCxDQUFDLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBYSxDQUFDO3lCQUM1QztxQkFDSjtpQkFDSjthQUNKO1NBQ0o7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBRTVCLHlJQUF5STtRQUN6SSx1SUFBdUk7UUFDdkkscUdBQXFHO1FBQ3JHLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDL0MsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUMxQzthQUFNO1lBQ0gsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNqQjtRQUVELCtHQUErRztRQUMvRyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsT0FBTyxvQkFBUSxFQUFDLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdkY7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDekxEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBRTdCLHdCQUFnQixHQUFTO0lBQ2xDLEVBQUUsRUFBRSxrQkFBa0I7SUFDdEIseUJBQXlCO0lBQ3pCLHVDQUF1QztJQUN2QyxPQUFPLEVBQUUsT0FBTztJQUNoQixZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSx1QkFBdUIsQ0FBQztJQUMxRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsZUFBZSxFQUFFLHVCQUF1QjtZQUN4QyxvQkFBb0IsRUFBRSx1QkFBdUI7U0FDaEQ7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsTUFBTSxFQUFFLG9EQUFvRDtZQUM1RCxlQUFlLEVBQUUseUdBQXlHO1lBQzFILG9CQUFvQixFQUFFLDRIQUE0SDtTQUNySjtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsY0FBYztZQUNuQyxjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQzFDLENBQUM7SUFDRiw0QkFBNEI7SUFDNUIsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBQ2YsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFtQixDQUFDO1FBRXZELHFEQUFxRDtRQUNyRCxJQUFJLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksdUJBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ2pGLE9BQU87UUFFWCxxRUFBcUU7UUFDckUsSUFBSSxtQkFBUSxDQUFDLGtDQUFrQyxDQUFDLFdBQVcsQ0FBQztZQUN4RCxPQUFPO1FBRVgsSUFBSSxLQUFLLEdBQUcsbUJBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xELHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM1QixLQUFLLEdBQUksbUJBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkQsb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBRWhCLDJEQUEyRDtRQUMzRCxJQUFJLGlCQUFpQixHQUFHLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBQyxJQUFHLHdCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBN0IsQ0FBNkIsQ0FBQyxDQUFDO1FBQzVELElBQUksS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXZCLGtFQUFrRTtRQUNsRSwrREFBK0Q7UUFDL0QsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLGtCQUFrQixHQUFHLG1CQUFRLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNFLHNGQUFzRjtRQUN0RixJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN0QyxJQUFJLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0M7UUFFRDs7O1VBR0U7UUFDRCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1FBRWhCLGlEQUFpRDtRQUNqRCxvQ0FBb0M7UUFDcEMsSUFBSSxnQkFBZ0IsR0FBRyxtQkFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ25ELG1GQUFtRjtZQUNuRjs7O2VBR0c7WUFDRixJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDMUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sb0JBQVEsRUFBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDOUM7WUFDRCxrQ0FBa0M7WUFDbEMsT0FBTyxJQUFJLENBQUM7U0FDaEI7UUFFRCxJQUFJLGdCQUFnQixHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QyxJQUFJLFVBQVUsR0FBRyxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvRCx1REFBdUQ7WUFDdkQsSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUM7Z0JBQ3JDLFVBQVUsR0FBSSxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWhFLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQzs7OzttQkFJRztnQkFDSCxJQUFNLE9BQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQUMsSUFBRyx5QkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQTlCLENBQThCLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLE9BQUs7b0JBQ04sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNwRDtpQkFBTTtnQkFDSCxnRUFBZ0U7YUFDbkU7U0FDSjtRQUVELElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM3QixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUMsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDN0MsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBUSxFQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDNUQ7WUFDRCxPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUNELE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3JKRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELDZGQUE4QztBQUVqQyx1Q0FBK0IsR0FBUztJQUNqRCxFQUFFLEVBQUUsaUNBQWlDO0lBQ3JDLE9BQU8sRUFBRSxvQkFBb0I7SUFDN0IsUUFBUSxFQUFFO1FBQ04sa0RBQWtELEVBQUU7WUFDaEQsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FBQztLQUMxQjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxzQ0FBc0M7WUFDaEQsUUFBUSxFQUFFLHNDQUFzQztZQUNoRCxPQUFPLEVBQUUsc0NBQXNDO1NBQ2xEO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUseUVBQXlFO1lBQ25GLE9BQU8sRUFBRSw4RkFBOEY7U0FDMUc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxxRUFBcUU7UUFDckUseUNBQXlDO1FBQ3pDLElBQUksU0FBUyxHQUFHLHVCQUFVLENBQUMsdUJBQXVCLENBQzlDLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLGVBQWUsRUFDZixJQUFJLEVBQ0osSUFBSSxDQUNQLENBQUM7UUFDRixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLEtBQUssR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FDMUIsV0FBVyxDQUFDLGFBQWEsRUFDekIsaUNBQWlDLEVBQ2pDLElBQUksQ0FDUCxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLEtBQUssR0FBRyxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLHFCQUFTLENBQUMsUUFBUSxDQUNkLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLGlDQUFpQyxFQUNqQyxLQUFLLENBQ1IsQ0FBQztTQUNMO1FBQ0QsSUFBSSxPQUFPLEdBQUcsbUJBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsSUFBSSxNQUFNLEdBQ04sT0FBTyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRW5FLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdEZEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFFbkMsd0NBQWdDLEdBQVM7SUFDbEQsRUFBRSxFQUFFLGtDQUFrQztJQUN0QyxPQUFPLEVBQUUsd0JBQXdCO0lBQ2pDLFlBQVksRUFBRSxDQUFDLDZCQUE2QixDQUFDO0lBQzdDLFFBQVEsRUFBRTtRQUNOLDhDQUE4QyxFQUFFO1lBQzVDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQUM7S0FDMUI7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsdUNBQXVDO1lBQ2pELFFBQVEsRUFBRSx1Q0FBdUM7WUFDakQsT0FBTyxFQUFFLHVDQUF1QztTQUNuRDtLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLG1FQUFtRTtZQUM3RSxPQUFPLEVBQUUsaUdBQWlHO1NBQzdHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxDQUFDLG1CQUFRLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxFQUFFO1lBQzVELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLE1BQU0sR0FBRyx1QkFBVSxDQUFDLGlCQUFpQixDQUNyQyxXQUFXLEVBQ1gsaUJBQWlCLENBQ3BCLENBQUM7UUFDRixxRUFBcUU7UUFDckUsSUFBSSxNQUFNLEVBQUU7WUFDUixPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDakVEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBRTFELG1HQUFrRDtBQUVsRCx1RkFBMEM7QUFFN0IsbUNBQTJCLEdBQVM7SUFDN0MsRUFBRSxFQUFFLDZCQUE2QjtJQUNqQyxPQUFPLEVBQUUsb0JBQW9CO0lBQzdCLFFBQVEsRUFBRTtRQUNOLDhDQUE4QyxFQUFFO1lBQzVDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQUM7S0FDMUI7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsa0NBQWtDO1lBQzVDLFFBQVEsRUFBRSxrQ0FBa0M7WUFDNUMsT0FBTyxFQUFFLGtDQUFrQztTQUM5QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLDJEQUEyRDtZQUNyRSxPQUFPLEVBQUUsdUZBQXVGO1NBQ25HO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpELElBQU0sSUFBSSxHQUFHLHlCQUFXLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUQsSUFBSSxJQUFJLEVBQUU7WUFDTixPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDNUREOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsNkZBQThDO0FBQzlDLGlHQUFtRDtBQUNuRCx1RkFBMEM7QUFDMUMsNkZBQThDO0FBRWpDLGdDQUF3QixHQUFTO0lBQzFDLEVBQUUsRUFBRSwwQkFBMEI7SUFDOUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsUUFBUSxFQUFFO1FBQ04sK0NBQStDLEVBQUU7WUFDN0MsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FBQztLQUMxQjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSwrQkFBK0I7WUFDekMsUUFBUSxFQUFFLCtCQUErQjtZQUN6QyxPQUFPLEVBQUUsK0JBQStCO1NBQzNDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsMENBQTBDO1lBQ3BELE9BQU8sRUFBRSxnRUFBZ0U7U0FDNUU7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLENBQUM7WUFDckQsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QztRQUNEO1lBQ0ksSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDMUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLGNBQWM7WUFDbkMsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBSSxNQUFNLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxNQUFNLEdBQUc7Z0JBQ0wsU0FBUyxFQUFFO29CQUNQLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7b0JBQ25HLElBQUksRUFBRSxPQUFPO2lCQUNoQjtnQkFDRCx1QkFBdUIsRUFBRTtvQkFDckIsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTTt3QkFDdkUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNO3dCQUM3RixVQUFVO3FCQUNiO29CQUNELElBQUksRUFBRSxPQUFPO2lCQUNoQjtnQkFDRCx3QkFBd0IsRUFBRTtvQkFDdEIsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO3dCQUM5RyxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNO3FCQUNsQztvQkFDRCxJQUFJLEVBQUUsT0FBTztpQkFDaEI7Z0JBQ0QsaUJBQWlCLEVBQUU7b0JBQ2Ysc0NBQXNDO29CQUN0QyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUM7b0JBQ3BELElBQUksRUFBRSxPQUFPO2lCQUNoQjtnQkFDRCxZQUFZLEVBQUUsRUFBRTtnQkFDaEIsMEJBQTBCLEVBQUUsRUFBRTtnQkFDOUIsMkJBQTJCLEVBQUUsRUFBRTtnQkFDL0Isb0JBQW9CLEVBQUUsRUFBRTthQUMzQjtZQUNELHlCQUF5QjtZQUN6QixNQUFNLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNwRCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3pEO1lBRUQsTUFBTSxDQUFDLDBCQUEwQixHQUFHLEVBQUU7WUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNsRSxNQUFNLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNyRjtZQUVELE1BQU0sQ0FBQywyQkFBMkIsR0FBRyxFQUFFO1lBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDbkUsTUFBTSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDdkY7WUFFRCxNQUFNLENBQUMsb0JBQW9CLEdBQUcsRUFBRTtZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQzVELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3pFO1lBRUQscUJBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLDBCQUEwQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzFGO1FBQ0QsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSywrQ0FBK0M7WUFDdkYsQ0FBQyxpQkFBTyxDQUFDLHVCQUF1QixJQUFJLElBQUk7Z0JBQ3BDLGlCQUFPLENBQUMsdUJBQXVCLElBQUksU0FBUztnQkFDNUMsaUJBQU8sQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM3RCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7UUFFRCxJQUFJLG1CQUFtQixHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsdUJBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxxREFBcUQ7WUFDdkcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsbURBQW1EO1lBQ25HLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtRQUVELGtDQUFrQztRQUNsQyxJQUFJLFFBQVEsSUFBSSxPQUFPLElBQUkscUJBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0QsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELG1DQUFtQztRQUNuQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSx3QkFBd0IsR0FBRyxtQkFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RHLCtFQUErRTtRQUMvRSwwRUFBMEU7UUFDMUUsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFO1lBQ3JCLHdCQUF3QixHQUFHLEtBQUssQ0FBQztTQUNwQztRQUVELElBQUkseUJBQXlCLEdBQUcsUUFBUSxJQUFJLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQztRQUMvRSxJQUFJLHdCQUF3QixJQUFJLHlCQUF5QixFQUFFO1lBQ3ZELGlFQUFpRTtZQUNqRSxJQUFJLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBSSxJQUFJLFdBQUksQ0FBQyxJQUFJLEVBQVQsQ0FBUyxDQUFDLENBQUM7WUFDcEUsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsY0FBSSxJQUFJLFdBQUksSUFBSSxNQUFNLENBQUMsWUFBWSxFQUEzQixDQUEyQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDM0UsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDVCxzRkFBc0Y7Z0JBQ3RGLElBQUksV0FBVyxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLENBQUMsTUFBTSxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7b0JBQ25DLE1BQU0sR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzVFLFdBQVcsR0FBRyxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDdEQ7Z0JBQ0QsV0FBVyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDN0MsT0FBTyxDQUFDLE1BQU0sSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO29CQUNuQyxNQUFNLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUM1RSxXQUFXLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDO2lCQUNoRDtnQkFDRCxXQUFXLEdBQUcsV0FBVyxDQUFDLHNCQUFzQixDQUFDO2dCQUNqRCxPQUFPLENBQUMsTUFBTSxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7b0JBQ25DLE1BQU0sR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzVFLFdBQVcsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUM7aUJBQ3BEO2dCQUNELElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ1QscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUVsRSx3REFBd0Q7b0JBQ3hELE1BQU0sR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsb0NBQW9DLEVBQUUsS0FBSyxDQUFDO3dCQUNqRixtQkFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQzt3QkFDaEUsbUJBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUVqRixJQUFJLE1BQU0sRUFBRTt3QkFDUixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsb0NBQW9DLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQzVFLE9BQU8sSUFBSSxDQUFDO3FCQUNmO2lCQUNKO3FCQUFNO29CQUNILE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzdMRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELDZGQUE4QztBQUVqQyxxQ0FBNkIsR0FBUztJQUMvQyxFQUFFLEVBQUUsK0JBQStCO0lBQ25DLE9BQU8sRUFBRSxrQkFBa0I7SUFDM0IsUUFBUSxFQUFFO1FBQ04sZ0RBQWdELEVBQUU7WUFDOUMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FBQztLQUMxQjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxvQ0FBb0M7WUFDOUMsUUFBUSxFQUFFLG9DQUFvQztZQUM5QyxPQUFPLEVBQUUsb0NBQW9DO1NBQ2hEO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsdUVBQXVFO1lBQ2pGLE9BQU8sRUFBRSw0RkFBNEY7U0FDeEc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxxRUFBcUU7UUFDckUseUNBQXlDO1FBQ3pDLElBQUksU0FBUyxHQUFHLHVCQUFVLENBQUMsdUJBQXVCLENBQzlDLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLGFBQWEsRUFDYixJQUFJLEVBQ0osSUFBSSxDQUNQLENBQUM7UUFDRixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLEtBQUssR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FDMUIsV0FBVyxDQUFDLGFBQWEsRUFDekIsK0JBQStCLEVBQy9CLElBQUksQ0FDUCxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLEtBQUssR0FBRyxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLHFCQUFTLENBQUMsUUFBUSxDQUNkLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLCtCQUErQixFQUMvQixLQUFLLENBQ1IsQ0FBQztTQUNMO1FBQ0QsSUFBSSxPQUFPLEdBQUcsbUJBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsSUFBSSxNQUFNLEdBQ04sT0FBTyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRW5FLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdEZEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFFbkMsK0JBQXVCLEdBQVM7SUFDekMsRUFBRSxFQUFFLHlCQUF5QjtJQUM3QixPQUFPLEVBQUUsc0NBQXNDO0lBQy9DLFFBQVEsRUFBRTtRQUNOLHlDQUF5QyxFQUFFO1lBQ3ZDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQ3JCO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsOEJBQThCO1lBQ3hDLFFBQVEsRUFBRSw4QkFBOEI7WUFDeEMsT0FBTyxFQUFFLDhCQUE4QjtTQUMxQztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLG9GQUFvRjtZQUM5RixPQUFPLEVBQUUsNkZBQTZGO1NBQ3pHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsRUFBRTtZQUMxRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQscUVBQXFFO1FBQ3JFLElBQUksTUFBTSxHQUNOLHVCQUFVLENBQUMsdUJBQXVCLENBQzlCLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLE1BQU0sRUFDTixJQUFJLEVBQ0osSUFBSSxDQUNQLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVqQixxRUFBcUU7UUFDckUsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUN2RUQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBRS9CLCtCQUF1QixHQUFTO0lBQ3pDLEVBQUUsRUFBRSx5QkFBeUI7SUFDN0IsT0FBTyxFQUFFLHNDQUFzQztJQUMvQyxRQUFRLEVBQUU7UUFDTixtREFBbUQsRUFBRTtZQUNqRCxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLDhCQUE4QjtZQUN4QyxRQUFRLEVBQUUsOEJBQThCO1lBQ3hDLE9BQU8sRUFBRSw4QkFBOEI7U0FDMUM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSwrREFBK0Q7WUFDekUsT0FBTyxFQUFFLHlGQUF5RjtTQUNyRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELHFGQUFxRjtRQUNyRixJQUFJLENBQUMsbUJBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLEVBQUU7WUFDMUQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksTUFBTSxHQUFHLENBQUMsbUJBQVEsQ0FBQyx3QkFBd0IsQ0FDM0MsV0FBVyxFQUNYLGFBQWEsRUFDYixJQUFJLEVBQ0osSUFBSSxDQUNQLENBQUM7UUFFRixxRUFBcUU7UUFDckUsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUNuRUQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUFzSDtBQUN0SCwrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBQzVDLGdHQUFnRDtBQUNoRCx1RkFBMEM7QUFFN0IsNkJBQXFCLEdBQVM7SUFDdkMsRUFBRSxFQUFFLHVCQUF1QjtJQUMzQixPQUFPLEVBQUUsT0FBTztJQUNoQixZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztJQUNqQyxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsNEJBQTRCO1lBQ3JDLE1BQU0sRUFBRSw0QkFBNEI7WUFDcEMsK0JBQStCLEVBQUUsNEJBQTRCO1lBQzdELDBCQUEwQixFQUFFLDRCQUE0QjtTQUMzRDtLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLDZGQUE2RjtZQUN0RyxNQUFNLEVBQUUsd0NBQXdDO1lBQ2hELCtCQUErQixFQUFFLDhHQUE4RztZQUMvSSwwQkFBMEIsRUFBRSxxR0FBcUc7U0FDcEk7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsNEJBQTRCO0lBQzVCLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUNmLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBbUIsQ0FBQztRQUV2RCxxREFBcUQ7UUFDckQsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxJQUFJLHVCQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztZQUNqRixPQUFPO1FBRVgsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxtQkFBUSxDQUFDLGtDQUFrQyxDQUFDLFdBQVcsQ0FBQztZQUN6RCxPQUFPO1FBRVgsSUFBSSxLQUFLLEdBQUcsbUJBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xELHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM1QixLQUFLLEdBQUksbUJBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkQsb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsaURBQWlEO1FBQ2pELG9DQUFvQztRQUNwQyxJQUFJLGdCQUFnQixHQUFHLG1CQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakUsSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELDREQUE0RDtZQUM1RCxJQUFJLGFBQWEsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ2hDLElBQUksYUFBYSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUMseUJBQXlCO2dCQUN6QixJQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZELElBQUksR0FBRyxLQUFLLEtBQUssSUFBSSxHQUFHLEtBQUssS0FBSztvQkFBRSxTQUFTO2dCQUU3Qyw4QkFBOEI7Z0JBQzlCLElBQUksVUFBVSxHQUFHLG1CQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDckMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQzdDO3FCQUFNO29CQUNILDhCQUE4QjtvQkFDOUIsVUFBVSxHQUFJLG1CQUFRLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVELElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDbkMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ2pEO2FBQ0o7WUFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN6QyxJQUFJLFFBQVEsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBUSxFQUFDLDBCQUEwQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7aUJBQ2xFO2dCQUNELE9BQU8sU0FBUyxDQUFDO2FBQ3BCO1lBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDMUIsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixLQUFLLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDekMsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMseUJBQWEsRUFBQywrQkFBK0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUM1RTtnQkFDRCxPQUFPLFNBQVMsQ0FBQzthQUNwQjtTQUVKOztZQUNHLE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3JIRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELDZGQUE4QztBQUVqQyxrQ0FBMEIsR0FBUztJQUM1QyxFQUFFLEVBQUUsNEJBQTRCO0lBQ2hDLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLFFBQVEsRUFBRTtRQUNOLGdDQUFnQyxFQUFFO1lBQzlCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQUM7S0FDMUI7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsaUNBQWlDO1lBQzNDLFFBQVEsRUFBRSxpQ0FBaUM7WUFDM0MsT0FBTyxFQUFFLGlDQUFpQztTQUM3QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLHFFQUFxRTtZQUMvRSxPQUFPLEVBQUUseUZBQXlGO1NBQ3JHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQscUVBQXFFO1FBQ3JFLHlDQUF5QztRQUN6QyxJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLHVCQUF1QixDQUM5QyxXQUFXLENBQUMsYUFBYSxFQUN6QixVQUFVLEVBQ1YsSUFBSSxFQUNKLElBQUksQ0FDUCxDQUFDO1FBQ0YsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQzFCLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLDRCQUE0QixFQUM1QixJQUFJLENBQ1AsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixLQUFLLEdBQUcsbUJBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQyxxQkFBUyxDQUFDLFFBQVEsQ0FDZCxXQUFXLENBQUMsYUFBYSxFQUN6Qiw0QkFBNEIsRUFDNUIsS0FBSyxDQUNSLENBQUM7U0FDTDtRQUNELElBQUksT0FBTyxHQUFHLG1CQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELElBQUksTUFBTSxHQUNOLE9BQU8sS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpFLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNILE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdEZEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFFbkMsb0NBQTRCLEdBQVM7SUFDOUMsRUFBRSxFQUFFLDhCQUE4QjtJQUNsQyxPQUFPLEVBQUUsd1BBQXdQO0lBQ2pRLFFBQVEsRUFBRTtRQUNOLHVEQUF1RCxFQUFFO1lBQ3JELFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQUM7S0FDMUI7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsbUNBQW1DO1lBQzdDLFFBQVEsRUFBRSxtQ0FBbUM7WUFDN0MsT0FBTyxFQUFFLG1DQUFtQztTQUMvQztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLHdFQUF3RTtZQUNsRixPQUFPLEVBQUUsMERBQTBEO1NBQ3RFO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQscUZBQXFGO1FBQ3JGLDZEQUE2RDtRQUM3RCxJQUFJLHVCQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUM1QyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQscURBQXFEO1FBQ3JELGtEQUFrRDtRQUNsRCxJQUFJLG1CQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUN4QyxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7UUFFRCxtREFBbUQ7UUFDbkQsSUFBSSx1QkFBVSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzlDLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjtRQUVELCtEQUErRDtRQUMvRCxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksUUFBUSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDM0Isd0NBQXdDO1FBQ3hDLHVHQUF1RztRQUN2RywyR0FBMkc7UUFDM0csNEZBQTRGO1FBQzVGLHNHQUFzRztRQUN0RyxJQUFJLE1BQU0sR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVztZQUMvRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFlBQVk7WUFDaEYsYUFBYSxFQUFFLFVBQVU7U0FDNUIsQ0FBQztRQUNGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3BDLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLG9GQUFvRjtRQUNwRixPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUN4RkQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBQzVDLGdHQUFnRDtBQUNoRCw2RkFBOEM7QUFFakMsOEJBQXNCLEdBQVM7SUFDeEMsRUFBRSxFQUFFLHdCQUF3QjtJQUM1QixPQUFPLEVBQUUsV0FBVztJQUNwQixRQUFRLEVBQUU7UUFDTix5Q0FBeUMsRUFBRTtZQUN2QyxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLDZCQUE2QjtZQUN2QyxRQUFRLEVBQUUsNkJBQTZCO1lBQ3ZDLE9BQU8sRUFBRSw2QkFBNkI7U0FDekM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSxnRUFBZ0U7WUFDMUUsT0FBTyxFQUFFLHFGQUFxRjtTQUNqRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBRW5ELG9HQUFvRztRQUNwRywwRUFBMEU7UUFDMUUsSUFDSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU07WUFDM0MsV0FBVyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7WUFDdEMsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztZQUMzQyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUNuQztZQUNFLHFFQUFxRTtZQUNyRSx5Q0FBeUM7WUFDekMsSUFBSSxTQUFTLEdBQUcsdUJBQVUsQ0FBQyx1QkFBdUIsQ0FDOUMsV0FBVyxDQUFDLGFBQWEsRUFDekIsTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLENBQ1AsQ0FBQztZQUNGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2xELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFFRCxJQUFJLEtBQUssR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FDMUIsV0FBVyxDQUFDLGFBQWEsRUFDekIsd0JBQXdCLEVBQ3hCLElBQUksQ0FDUCxDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDUixLQUFLLEdBQUcsbUJBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0MscUJBQVMsQ0FBQyxRQUFRLENBQ2QsV0FBVyxDQUFDLGFBQWEsRUFDekIsd0JBQXdCLEVBQ3hCLEtBQUssQ0FDUixDQUFDO2FBQ0w7WUFDRCxJQUFJLE9BQU8sR0FBRyxtQkFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRCxJQUFJLE1BQU0sR0FDTixPQUFPLEtBQUssRUFBRTtnQkFDZCxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDeEM7aUJBQU07Z0JBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzdCO1NBQ0o7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ2pHRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBRTdCLDZCQUFxQixHQUFTO0lBQ3ZDLEVBQUUsRUFBRSx1QkFBdUI7SUFDM0IsT0FBTyxFQUFFLDZDQUE2QztJQUN0RCxRQUFRLEVBQUU7UUFDTixrQkFBa0IsRUFBRTtZQUNoQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUNyQjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLDRCQUE0QjtZQUNyQyxRQUFRLEVBQUUsNEJBQTRCO1lBQ3RDLFFBQVEsRUFBRSw0QkFBNEI7WUFDdEMsUUFBUSxFQUFFLDRCQUE0QjtZQUN0QyxRQUFRLEVBQUUsNEJBQTRCO1NBQ3pDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsNkRBQTZEO1lBQ3RFLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSxpREFBaUQ7WUFDM0QsUUFBUSxFQUFFLG1FQUFtRTtZQUM3RSxRQUFRLEVBQUUsd0ZBQXdGO1NBQ3JHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsRUFBRTtJQUNaLEdBQUcsRUFBRSxDQUFDO1lBQ0YsUUFBUSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixRQUFRLEVBQUUsY0FBYztnQkFDeEIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLFFBQVEsRUFBRSxjQUFjO2FBQzNCO1NBQ0osQ0FBQztJQUNGLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBRW5ELGVBQWU7UUFDZixJQUFJLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU5Rzs7O1dBR0c7UUFFSCw4Q0FBOEM7UUFDOUMsMkZBQTJGO1FBQzNGLElBQUksTUFBTSxHQUFHLG1CQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUN6RCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE1BQU0sR0FBRyxRQUFRLElBQUksdUJBQVUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0Q7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsdUJBQXVCO1lBQ3ZCLE1BQU0sR0FBRyx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RCxzR0FBc0c7WUFDdEcseUNBQXlDO1lBQ3pDLCtCQUErQjtTQUNsQztRQUNELHFFQUFxRTtRQUNyRSxJQUFJLE1BQU0sRUFBRTtZQUNSLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNoRTtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDNUZEOzs7Ozs7Ozs7OzsrRUFXK0U7OztBQUUvRSxnR0FBZ0Q7QUFDaEQsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUU3QywrQkFBdUIsR0FBUztJQUN6QyxFQUFFLEVBQUUseUJBQXlCO0lBQzdCLE9BQU8sRUFBRSx3REFBd0Q7SUFDakUsUUFBUSxFQUFFO1FBQ04sMEJBQTBCLEVBQUU7WUFDeEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FDckI7S0FDSjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSw4QkFBOEI7WUFDdkMsUUFBUSxFQUFFLDhCQUE4QjtZQUN4QyxRQUFRLEVBQUUsOEJBQThCO1NBQzNDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsMkRBQTJEO1lBQ3BFLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSw0SEFBNEg7U0FDekk7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDeEYsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUN2QixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDeEMsQ0FBQztJQUNGLHFEQUFxRDtJQUNyRCxHQUFHLEVBQUUsUUFBUTtJQUNiLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBRW5ELElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNwQyxPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUN6QztRQUVELE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzFERDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELDRJQUE0RTtBQUM1RSxxSEFBZ0U7QUFDaEUsdUZBQTBDO0FBRTdCLHNCQUFjLEdBQVM7SUFDaEMsRUFBRSxFQUFFLGdCQUFnQjtJQUNwQixPQUFPLEVBQUUsT0FBTztJQUNoQixRQUFRLEVBQUU7UUFDTixxQkFBcUIsRUFBRTtZQUNuQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixRQUFRLEVBQUUscUJBQXFCO1lBQy9CLE9BQU8sRUFBRSxxQkFBcUI7U0FDakM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSwyRUFBMkU7WUFDckYsT0FBTyxFQUFFLCtGQUErRjtTQUMzRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQzFDLENBQUM7SUFDRiw4R0FBOEc7SUFDOUcsMEhBQTBIO0lBQzFILG1CQUFtQjtJQUNuQixHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3pCLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLFdBQVcsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzlCLElBQUksY0FBYyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDakMsSUFBSSxhQUFhLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDL0MsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUV6QixJQUFJLGlCQUFpQixFQUFFO1lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEUsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDWixJQUFJLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pDLElBQUksbUJBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEVBQUU7b0JBQ3hELElBQUksU0FBUyxHQUFHLGlDQUFlLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzVELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUU7d0JBQzdCLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLHdDQUF3QyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUNuRyxpRUFBaUU7d0JBQ2pFLElBQUksZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLHlDQUF5QyxDQUFDLEVBQUU7NEJBQ25GLGdCQUFnQixFQUFFLENBQUM7NEJBQ25CLElBQUksZUFBZSxHQUFHLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDOzRCQUN6RixJQUFJLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUV4RCw0QkFBNEI7NEJBQzVCLElBQUksZUFBZSxHQUFHLENBQUMsRUFBRTtnQ0FDckIsSUFBSSxHQUFHLEtBQUssQ0FBQztnQ0FDYixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUM7NkJBQy9EOzRCQUNELGtDQUFrQztpQ0FDN0IsSUFBSSxnQkFBZ0IsRUFBRTtnQ0FDdkIsdUNBQXVDO2dDQUN2QyxJQUFJLGVBQWUsSUFBSSxDQUFDLEVBQUU7b0NBQ3RCLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0NBQ3BCLElBQUksR0FBRyxLQUFLLENBQUM7d0NBQ2IsOENBQThDO3dDQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsUUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFOzRDQUN0RCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0RBQ2xCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NkNBQzdCO3lDQUNKO3FDQUNKO2lDQUNKOzZCQUNKOzRCQUNELHNDQUFzQzs0QkFDdEMsSUFBSSxJQUFJLElBQUksZUFBZSxJQUFJLENBQUMsRUFBRTtnQ0FDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFFBQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtvQ0FDdEQsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLDBEQUEwRDt3Q0FDbkYsd0JBQXdCO3dDQUN4QixJQUFJLFdBQVcsR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dDQUUzRCw2QkFBNkI7d0NBQzdCLElBQUksR0FBRyxXQUFXLElBQUksSUFBSSxDQUFDO3dDQUUzQiwrRkFBK0Y7d0NBQy9GLHlGQUF5Rjt3Q0FDekYsNEJBQTRCO3dDQUM1QixJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRTs0Q0FDekMsSUFBSSxHQUFHLGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3lDQUM3Qzt3Q0FFRCxJQUFJLENBQUMsSUFBSSxFQUFFOzRDQUNQLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnREFDbEIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs2Q0FDN0I7eUNBQ0o7d0NBQ0QsNkVBQTZFO3dDQUM3RSwrRUFBK0U7d0NBQy9FLFVBQVU7NkNBQ0w7NENBQ0QsTUFBTTt5Q0FDVDtxQ0FDSjtpQ0FDSjs2QkFDSjt5QkFDSjtxQkFDSjtvQkFDRCxJQUFJLENBQUMsSUFBSTt3QkFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN6QzthQUNKO1NBQ0o7UUFDRCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzVCLElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxFQUFFO1lBRVQsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDbkQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDckIsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDdkM7U0FDSjtRQUVELCtIQUErSDtRQUMvSCxJQUFJLGdCQUFnQixJQUFJLENBQUMsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2pHO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzVKRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBRTdCLHlCQUFpQixHQUFTO0lBQ25DLEVBQUUsRUFBRSxtQkFBbUI7SUFDdkIsT0FBTyxFQUFFLHNCQUFzQjtJQUMvQixRQUFRLEVBQUU7UUFDTixrQkFBa0IsRUFBRTtZQUNoQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUNyQjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxRQUFRLEVBQUUsd0JBQXdCO1lBQ2xDLFFBQVEsRUFBRSx3QkFBd0I7WUFDbEMsUUFBUSxFQUFFLHdCQUF3QjtZQUNsQyxRQUFRLEVBQUUsd0JBQXdCO1NBQ3JDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsMERBQTBEO1lBQ25FLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSx3Q0FBd0M7WUFDbEQsUUFBUSxFQUFFLDBEQUEwRDtZQUNwRSxRQUFRLEVBQUUsK0VBQStFO1NBQzVGO0tBQ0o7SUFDRCxRQUFRLEVBQUUsRUFBRTtJQUNaLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUNaLFFBQVEsRUFBRTtnQkFDTixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixRQUFRLEVBQUUsY0FBYzthQUMzQjtTQUNKLENBQUM7SUFDRixHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxlQUFlO1FBQ2YsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25DLGlFQUFpRTtZQUNqRSxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hELHFGQUFxRjtRQUNyRixJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksUUFBUSxLQUFLLEtBQUs7WUFBRSxPQUFPO1FBRXJEOzs7V0FHRztRQUVIOzs7O1dBSUc7UUFFSCw4Q0FBOEM7UUFDOUMsMkZBQTJGO1FBQzNGLElBQUksTUFBTSxHQUFHLG1CQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUN6RCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELE1BQU0sR0FBRyxRQUFRLElBQUksdUJBQVUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0Q7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsdUJBQXVCO1lBQ3ZCLE1BQU0sR0FBRyx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RCxzR0FBc0c7WUFDdEcseUNBQXlDO1lBQ3pDLCtCQUErQjtTQUNsQztRQUNELHFFQUFxRTtRQUNyRSxJQUFJLE1BQU0sRUFBRTtZQUNSLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQztTQUM1QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdkdEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBNEc7QUFDNUcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQscUhBQWdFO0FBQ2hFLHVGQUEwQztBQUU3QixvQ0FBNEIsR0FBUztJQUM5QyxFQUFFLEVBQUUsOEJBQThCO0lBQ2xDLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFlBQVksRUFBRSxDQUFDLG1CQUFtQixDQUFDO0lBQ25DLFFBQVEsRUFBRTtRQUNOLGlDQUFpQyxFQUFFO1lBQy9CLE1BQU0sRUFBRSxNQUFNO1lBQ2QsOEJBQThCLEVBQUUsOEJBQThCO1NBQUM7S0FDdEU7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsbUNBQW1DO1lBQzNDLDhCQUE4QixFQUFFLG1DQUFtQztZQUNuRSxPQUFPLEVBQUUsbUNBQW1DO1NBQy9DO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsYUFBYTtZQUNyQiw4QkFBOEIsRUFBRSxnRUFBZ0U7WUFDaEcsT0FBTyxFQUFFLGlFQUFpRTtTQUM3RTtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQzFDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBRW5ELHFEQUFxRDtRQUNyRCxJQUFJLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksdUJBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ2pGLE9BQU87UUFFWCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDcEMsSUFBSSxjQUFjLEdBQUcsaUNBQWUsQ0FBQyxjQUFjLENBQUM7UUFDcEQsaUZBQWlGO1FBQ2pGLHFFQUFxRTtRQUNyRSxJQUFJLEtBQUssR0FBRyxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEQsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCwyR0FBMkc7UUFDM0cseUNBQXlDO1FBQ3pDLElBQUksUUFBUSxLQUFLLFVBQVUsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDN0QsT0FBTyxJQUFJLENBQUM7UUFFaEIsc0dBQXNHO1FBQ3RHLElBQUksY0FBYyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNySCxLQUFtQixVQUFjLEVBQWQsaUNBQWMsRUFBZCw0QkFBYyxFQUFkLElBQWMsRUFBRTtZQUE5QixJQUFNLElBQUk7WUFDWCxJQUFJLG1CQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJO2dCQUM3RCwyREFBMkQ7Z0JBQzNELE9BQU8sSUFBSSxDQUFDO1NBQ25CO1FBRUQsSUFBSSxZQUFZLEdBQUcsdUJBQVUsQ0FBQyxZQUFZLENBQUM7UUFFM0MsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUU5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxJQUFJLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzRyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUVYLGtFQUFrRTtvQkFDbEUsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFFbEksNEdBQTRHO29CQUM1RyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNULElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLHVCQUF1QixDQUFDLEVBQUU7NEJBQ3JELElBQUksV0FBVyxHQUFHLGlDQUFlLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQzs0QkFDdkUsSUFBSSxXQUFXLEVBQUUsRUFBRSxvREFBb0Q7Z0NBQ25FLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLHNCQUFzQixHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLHNCQUFzQixFQUFFLENBQUMsRUFBRSxFQUFFO29DQUMxRixJQUFJLEVBQUUsR0FBRyxvQkFBb0IsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO29DQUN2RCxJQUFJLFdBQVcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsdUJBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLENBQUM7b0NBQ2xILElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQWEsQ0FBQztvQ0FDN0MsT0FBTyxDQUFDLEVBQUU7d0NBRU4sTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7d0NBQ3ZFLElBQUksQ0FBQyxNQUFNLEVBQUU7NENBRVQsd0VBQXdFOzRDQUN4RSxJQUFJLEdBQUcsR0FBRyxlQUFlLENBQUM7NENBQzFCLElBQUksWUFBWSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSx1QkFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQzs0Q0FDMUcsSUFBSSxFQUFFLEdBQVksWUFBWSxDQUFDLFdBQVcsRUFBYSxDQUFDOzRDQUN4RCxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRTtnREFDbEIsa0hBQWtIO2dEQUNsSCxVQUFVO2dEQUNWLG1IQUFtSDtnREFDbkgsbUhBQW1IO2dEQUNuSCxtRkFBbUY7Z0RBQ25GLEVBQUU7Z0RBQ0Ysc0hBQXNIO2dEQUN0SCw0QkFBNEI7Z0RBQzVCLElBQUksdUJBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsRUFBRTtvREFDMUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQWEsQ0FBQztvREFDM0MsU0FBUztpREFDWjtnREFFRCxNQUFNLEdBQUcsdUJBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29EQUM5QixDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dEQUVwRSxJQUFJLENBQUMsTUFBTSxFQUFFO29EQUNMLDBCQUEwQjtvREFDMUIsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dEQUM3RCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dEQUVuQywyRUFBMkU7d0RBQzNFLDZFQUE2RTt3REFDN0UsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7cURBQy9GO2lEQUNSO2dEQUNELEVBQUUsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFhLENBQUM7NkNBQzlDO3lDQUNKO3dDQUNELElBQUksQ0FBQyxNQUFNLEVBQUU7NENBQ1QscUdBQXFHOzRDQUNyRyw4REFBOEQ7NENBQzlELE1BQU07eUNBQ1Q7d0NBQ0QsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQWEsQ0FBQztxQ0FDNUM7aUNBQ0o7NkJBQ0o7aUNBQU07Z0NBQ0gsNEdBQTRHO2dDQUM1RywrQkFBK0I7Z0NBQy9CLElBQUksR0FBRyxHQUFHLGVBQWUsQ0FBQztnQ0FDMUIsSUFBSSxZQUFZLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLHVCQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO2dDQUNwSCxJQUFJLEVBQUUsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFhLENBQUM7Z0NBQy9DLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO29DQUNsQixrSEFBa0g7b0NBQ2xILFVBQVU7b0NBQ1YsbUhBQW1IO29DQUNuSCxtSEFBbUg7b0NBQ25ILG1GQUFtRjtvQ0FDbkYsRUFBRTtvQ0FDRixzSEFBc0g7b0NBQ3RILDRCQUE0QjtvQ0FDNUIsSUFBSSx1QkFBVSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxFQUFFO3dDQUMxQyxFQUFFLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBYSxDQUFDO3dDQUMzQyxTQUFTO3FDQUNaO29DQUVELE1BQU0sR0FBRyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7d0NBQzlCLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7b0NBRXBFLElBQUksQ0FBQyxNQUFNLEVBQUU7d0NBQ1QsMEJBQTBCO3dDQUMxQixJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7NENBQzdELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7NENBRW5DLDJFQUEyRTs0Q0FDM0UsNkVBQTZFOzRDQUM3RSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQzt5Q0FDL0Y7cUNBQ0o7b0NBQ0QsRUFBRSxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQWEsQ0FBQztpQ0FDOUM7NkJBQ0o7eUJBQ0o7NkJBQU07NEJBQ0gsa0RBQWtEOzRCQUNsRCxNQUFNLEdBQUcsSUFBSSxDQUFDO3lCQUNqQjtxQkFDSjtpQkFDSjthQUNKO1lBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDVCxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLEVBQUU7Z0JBQ3hCLFdBQVcsR0FBRyxNQUFNLENBQUM7YUFDeEI7U0FDSjtRQUVELElBQUksU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkQsSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUV2QyxnR0FBZ0c7UUFDaEcsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM1QixJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLDJCQUFvQixFQUFFLHdCQUFxQixDQUFDLEVBQUU7Z0JBQ3RGLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBYSxFQUFDLDhCQUE4QixFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEksQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUNyTkQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsc0dBQXNEO0FBQ3RELDJGQUErQztBQUMvQyw0SUFBNEU7QUFDNUUsNkZBQThDO0FBQzlDLG1HQUFrRDtBQUVyQyxpQ0FBeUIsR0FBUztJQUMzQyxFQUFFLEVBQUUsMkJBQTJCO0lBQy9CLE9BQU8sRUFBRSxvSEFBb0g7SUFDN0gsUUFBUSxFQUFFO1FBQ04sc0JBQXNCLEVBQUU7WUFDcEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FBQztLQUMxQjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxnQ0FBZ0M7WUFDMUMsUUFBUSxFQUFFLGdDQUFnQztZQUMxQyxPQUFPLEVBQUUsZ0NBQWdDO1NBQzVDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsc0lBQXNJO1lBQ2hKLFFBQVEsRUFBRSx3SkFBd0o7WUFDbEssT0FBTyxFQUFFLGdIQUFnSDtTQUM1SDtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsQ0FBQztZQUNyRCxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUMxQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsY0FBYztZQUNuQyxjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSx3UUFBd1E7UUFDeFEsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUVuRCxvR0FBb0c7UUFDcEcsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUM7UUFDcEMsSUFBSSx3QkFBd0IsR0FBRyxFQUFFLENBQUM7UUFDbEMsT0FBTyxpQkFBaUIsRUFBRTtZQUN0Qix3QkFBd0IsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNwRCxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7U0FDdkQ7UUFDRCx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsY0FBSTtZQUNqQyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRTtvQkFDbkUsT0FBTyxJQUFJLEVBQUMsdUVBQXVFO2lCQUN0RjthQUNKO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsMEJBQTBCO1FBQzFCLElBQUksYUFBYSxHQUFHLHVCQUFZLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0QsSUFBSSxTQUFTLEdBS1QscUJBQVMsQ0FBQyxRQUFRLENBQ2xCLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLDJCQUEyQixFQUMzQixJQUFJLENBQ1AsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWiw4Q0FBOEM7WUFDOUMsU0FBUyxHQUFHO2dCQUNSLGVBQWUsRUFBRSxFQUFFO2dCQUNuQiw2QkFBNkIsRUFBRSxFQUFFO2dCQUNqQyxzQkFBc0IsRUFBRSxFQUFFO2dCQUMxQix5QkFBeUIsRUFBRSxFQUFFO2FBQ2hDLENBQUM7WUFDRixJQUFJLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDcEQsNkxBQTZMLENBQ2hNLENBQUM7WUFDRixJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdEQsSUFBSSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7WUFDaEMsSUFBSSx5QkFBeUIsR0FBYyxFQUFFLENBQUM7WUFFOUMsdU1BQXVNO1lBQ3ZNLElBQUksNkJBQTZCLEdBQUcsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO2dCQUNoQyxPQUFPLENBQUMsRUFBRTtvQkFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO3dCQUNaLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxRQUFRLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUU7NEJBQzdELG1CQUFtQixHQUFHLElBQUksQ0FBQzt5QkFDOUI7cUJBQ0o7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFO29CQUN0Qiw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN6RDthQUNKO1lBQ0QsZUFBZSxHQUFHLDZCQUE2QixDQUFDO1lBR2hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM3QyxtQ0FBbUM7Z0JBQ25DLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUN6QyxPQUFPLENBQUMsRUFBRTtvQkFDTixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNaLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDO2lCQUN2QjtnQkFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDakMsa0RBQWtEO29CQUNsRCwwRUFBMEU7b0JBQzFFLElBQUksY0FBYyxHQUFHO3dCQUNqQixPQUFPO3dCQUNQLFFBQVE7d0JBQ1IsTUFBTTt3QkFDTixRQUFRO3dCQUNSLE1BQU07d0JBQ04sS0FBSzt3QkFDTCxTQUFTO3FCQUNaLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO29CQUM1QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQzdCLGVBQWUsR0FBRzs0QkFDZCxlQUFlOzRCQUNmLGFBQWE7NEJBQ2IsTUFBTTs0QkFDTixRQUFROzRCQUNSLE1BQU07NEJBQ04sWUFBWTs0QkFDWixRQUFROzRCQUNSLFFBQVE7eUJBQ1gsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0tBQWdLO3FCQUM1TTtvQkFDRCxJQUFJLGNBQWMsSUFBSSxlQUFlLEVBQUU7d0JBQ25DLGdDQUFnQzt3QkFDaEMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxNQUFNO3FCQUNUO29CQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN0QixvRUFBb0U7d0JBQ3BFLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbEMsTUFBTTtxQkFDVDtpQkFDSjthQUNKO1lBRUQsSUFBSSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7WUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdDLElBQU0sSUFBSSxHQUFHLHlCQUFXLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLG1DQUFtQztnQkFDbkMsNkJBQTZCLENBQUMsSUFBSTtnQkFDOUIsK0NBQStDO2dCQUMvQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDM0UsQ0FBQzthQUNMO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEQscUVBQXFFO2dCQUNyRSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUNULDZDQUE2Qzt3QkFDN0MsU0FBUztxQkFDWjtvQkFFRCx3RUFBd0U7b0JBQ3hFLElBQ0ksc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSTt3QkFDbEMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUNwQzt3QkFDRSwrREFBK0Q7d0JBQy9ELElBQ0ksdUJBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN6Qyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDM0M7NEJBQ0Usb0NBQW9DOzRCQUNwQyxJQUNJLDZCQUE2QixDQUFDLENBQUMsQ0FBQztnQ0FDaEMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEVBQ2xDO2dDQUNFLDJEQUEyRDtnQ0FDM0QsaURBQWlEO2dDQUNqRCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTO2dDQUNuRCxVQUFVLEdBQUcsSUFBSSxDQUFDO2dDQUNsQixNQUFNO2dDQUNOLElBQUk7NkJBQ1A7aUNBQU07Z0NBQ0gsb0ZBQW9GO2dDQUNwRix3R0FBd0c7Z0NBQ3hHLFdBQVcsR0FBRyxJQUFJLENBQUM7NkJBQ3RCO3lCQUNKOzZCQUFNOzRCQUNILDBEQUEwRDt5QkFDN0Q7cUJBQ0o7eUJBQU0sSUFDSCxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJO3dCQUNsQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQ3BDO3dCQUNFLHVDQUF1Qzt3QkFDdkMsU0FBUztxQkFDWjtvQkFFRCw0RUFBNEU7b0JBQzVFLElBQ0ksaUJBQU8sQ0FBQyxRQUFRLENBQ1osc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQ3pCLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUM1QixFQUNIO3dCQUNFLHVDQUF1Qzt3QkFDdkMsSUFDSSx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3pDLHVCQUFVLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMzQzs0QkFDRSxvQ0FBb0M7NEJBQ3BDLElBQ0ksNkJBQTZCLENBQUMsQ0FBQyxDQUFDO2dDQUNoQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsRUFDbEM7Z0NBQ0UsMkRBQTJEO2dDQUMzRCxpREFBaUQ7Z0NBQ2pELHlCQUF5QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0NBQ25ELFVBQVUsR0FBRyxJQUFJLENBQUM7Z0NBQ2xCLE1BQU07Z0NBQ04sSUFBSTs2QkFDUDtpQ0FBTTtnQ0FDSCxvRkFBb0Y7Z0NBQ3BGLHdHQUF3RztnQ0FDeEcsV0FBVyxHQUFHLElBQUksQ0FBQzs2QkFDdEI7eUJBQ0o7NkJBQU07NEJBQ0gsMERBQTBEO3lCQUM3RDtxQkFDSjt5QkFBTTt3QkFDSCxzQ0FBc0M7cUJBQ3pDO2lCQUNKO2dCQUNELElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2IsSUFBSSxXQUFXLEVBQUU7d0JBQ2IseUJBQXlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUM1Qzt5QkFBTTt3QkFDSCx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpR0FBaUc7cUJBQzVJO2lCQUNKO2FBQ0o7WUFDRCxTQUFTLENBQUMsNkJBQTZCO2dCQUNuQyw2QkFBNkIsQ0FBQztZQUNsQyxTQUFTLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztZQUM1QyxTQUFTLENBQUMsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUM7WUFDMUQsU0FBUyxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO1lBQ2hFLHFCQUFTLENBQUMsUUFBUSxDQUNkLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLDJCQUEyQixFQUMzQixTQUFTLENBQ1osQ0FBQztZQUVGLDREQUE0RDtZQUM1RCw0Q0FBNEM7U0FDL0MsQ0FBQyxnQkFBZ0I7UUFFbEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RELFlBQVksR0FBRyxDQUFDLENBQUM7YUFDcEI7U0FDSjtRQUNELElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDaEUsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFDcEI7Z0JBQ0ksdUJBQVUsQ0FBQyxVQUFVLENBQ2pCLFNBQVMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQzFDO2FBQ0osQ0FDSixDQUFDO1NBQ0w7YUFBTSxJQUFJLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDdkUsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFDcEI7Z0JBQ0ksdUJBQVUsQ0FBQyxVQUFVLENBQ2pCLFNBQVMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQzFDO2dCQUNELFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUM7YUFDeEQsQ0FDSixDQUFDO1NBQ0w7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3pURDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBRW5DLDhCQUFzQixHQUFTO0lBQ3hDLEVBQUUsRUFBRSx3QkFBd0I7SUFDNUIsT0FBTyxFQUFFLFdBQVc7SUFDcEIsUUFBUSxFQUFFO1FBQ04sK0NBQStDLEVBQUU7WUFDN0MsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FBQztLQUMxQjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSw2QkFBNkI7WUFDdkMsUUFBUSxFQUFFLDZCQUE2QjtZQUN2QyxPQUFPLEVBQUUsNkJBQTZCO1NBQ3pDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsZ0VBQWdFO1lBQzFFLE9BQU8sRUFBRSxvRkFBb0Y7U0FDaEc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxJQUFJLFlBQVksR0FBRyxtQkFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV0RCxJQUFJLGFBQWEsR0FBRyxtQkFBUSxDQUFDLG1CQUFtQixDQUM1QyxXQUFXLEVBQ1gsVUFBVSxFQUNWLElBQUksQ0FDUCxDQUFDO1FBQ0YsSUFBSSxLQUFLLEdBQUcsdUJBQVUsQ0FBQyx1QkFBdUIsQ0FDMUMsV0FBVyxDQUFDLGFBQWEsRUFDekIsTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLENBQ1AsQ0FBQztRQUNGLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXO2dCQUFFLFNBQVM7WUFDdkMsTUFBTSxHQUFHLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUIsSUFBSSxpQkFBaUIsR0FBRyxtQkFBUSxDQUFDLG1CQUFtQixDQUNoRCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsVUFBVSxFQUNWLElBQUksQ0FDUCxDQUFDO1lBQ0YsSUFBSSxpQkFBaUIsS0FBSyxhQUFhLEVBQUU7Z0JBQ3JDLElBQUksbUJBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxFQUFFO29CQUNsRCxNQUFNLEdBQUcsb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztvQkFDNUIsTUFBTTtpQkFDVDthQUNKO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ2hGRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBRW5DLCtCQUF1QixHQUFTO0lBQ3pDLEVBQUUsRUFBRSx5QkFBeUI7SUFDN0IsT0FBTyxFQUFFLFVBQVU7SUFDbkIsUUFBUSxFQUFFO1FBQ04sNkNBQTZDLEVBQUU7WUFDM0MsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FBQztLQUMxQjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSw4QkFBOEI7WUFDeEMsUUFBUSxFQUFFLDhCQUE4QjtZQUN4QyxPQUFPLEVBQUUsOEJBQThCO1NBQzFDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsd0VBQXdFO1lBQ2xGLE9BQU8sRUFBRSwrRkFBK0Y7U0FDM0c7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLGNBQWM7WUFDbkMsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUVuRCxxRUFBcUU7UUFDckUsaUVBQWlFO1FBQ2pFLDJDQUEyQztRQUMzQyxJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLHVCQUF1QixDQUM5QyxXQUFXLENBQUMsYUFBYSxFQUN6QixNQUFNLEVBQ04sSUFBSSxFQUNKLElBQUksQ0FDUCxDQUFDO1FBQ0YsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxNQUFNLEdBQUcsbUJBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3ZFRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELDZGQUE4QztBQUVqQyxvQ0FBNEIsR0FBUztJQUM5QyxFQUFFLEVBQUUsOEJBQThCO0lBQ2xDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsUUFBUSxFQUFFO1FBQ04sK0NBQStDLEVBQUU7WUFDN0MsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FBQztLQUMxQjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxtQ0FBbUM7WUFDN0MsUUFBUSxFQUFFLG1DQUFtQztZQUM3QyxPQUFPLEVBQUUsbUNBQW1DO1NBQy9DO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsc0VBQXNFO1lBQ2hGLE9BQU8sRUFBRSwyRkFBMkY7U0FDdkc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxxRUFBcUU7UUFDckUsSUFBSSxTQUFTLEdBQUcsdUJBQVUsQ0FBQyx1QkFBdUIsQ0FDOUMsV0FBVyxDQUFDLGFBQWEsRUFDekIsWUFBWSxFQUNaLElBQUksRUFDSixJQUFJLENBQ1AsQ0FBQztRQUNGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksS0FBSyxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUMxQixXQUFXLENBQUMsYUFBYSxFQUN6Qiw4QkFBOEIsRUFDOUIsSUFBSSxDQUNQLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsS0FBSyxHQUFHLG1CQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0MscUJBQVMsQ0FBQyxRQUFRLENBQ2QsV0FBVyxDQUFDLGFBQWEsRUFDekIsOEJBQThCLEVBQzlCLEtBQUssQ0FDUixDQUFDO1NBQ0w7UUFDRCxJQUFJLE9BQU8sR0FBRyxtQkFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLE1BQU0sR0FDTixPQUFPLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFbkUsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUN4QzthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUNyRkQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQscUhBQWdFO0FBQ2hFLDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBRTdCLDRCQUFvQixHQUFTO0lBQ3RDLEVBQUUsRUFBRSxzQkFBc0I7SUFDMUIsT0FBTyxFQUFFLGFBQWE7SUFDdEIsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7SUFDbkMsUUFBUSxFQUFFO1FBQ04sOENBQThDLEVBQUU7WUFDNUMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FDckI7S0FDSjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSwyQkFBMkI7WUFDcEMsUUFBUSxFQUFFLDJCQUEyQjtZQUNyQyxRQUFRLEVBQUUsMkJBQTJCO1NBQ3hDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUseUZBQXlGO1lBQ2xHLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSwrR0FBK0c7U0FDNUg7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFtQixDQUFDO1FBRXZELHFEQUFxRDtRQUNyRCxJQUFJLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksdUJBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ2pGLE9BQU87UUFFWCw4RUFBOEU7UUFDOUUsSUFBSSxtQkFBUSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxJQUFJLGlCQUFPLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDO1lBQzlGLE9BQU87UUFFWCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxjQUFjLEdBQUcsaUNBQWUsQ0FBQyxjQUFjLENBQUM7UUFDcEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLGNBQWMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ2pDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztRQUV4QixJQUFJLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBSSxJQUFJLFdBQUksQ0FBQyxJQUFJLEVBQVQsQ0FBUyxDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsT0FBTyxVQUFVLEtBQUssTUFBTSxFQUFFO1lBQzFCLEtBQUssRUFBRSxDQUFDO1lBQ1IsVUFBVSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBRTVEO1FBRUQ7Ozs7Ozs7Ozs7Ozs7O1VBY0U7UUFDRixJQUFNLElBQUksR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtZQUNoRSxlQUFlLEVBQUUsQ0FBQztZQUNsQixNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ2YsY0FBYyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVGLE1BQU0sR0FBRyxVQUFVLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLE1BQU07b0JBQUUsTUFBTTthQUNyQjtZQUNELElBQUksTUFBTSxJQUFJLEtBQUssRUFBRTtnQkFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQjtTQUNKO1FBRUQsSUFBSSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2QyxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFDLDJHQUEyRztRQUMzRyxJQUFJLGVBQWUsSUFBSSxDQUFDLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzNFO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3hIRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELDZGQUE4QztBQUVqQyxnQ0FBd0IsR0FBUztJQUMxQyxFQUFFLEVBQUUsMEJBQTBCO0lBQzlCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFFBQVEsRUFBRTtRQUNOLDhDQUE4QyxFQUFFO1lBQzVDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQUM7S0FDMUI7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsK0JBQStCO1lBQ3pDLFFBQVEsRUFBRSwrQkFBK0I7WUFDekMsT0FBTyxFQUFFLCtCQUErQjtTQUMzQztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLGtFQUFrRTtZQUM1RSxPQUFPLEVBQUUsdUZBQXVGO1NBQ25HO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsb0dBQW9HO1FBQ3BHLDBFQUEwRTtRQUMxRSxJQUNJLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssUUFBUTtZQUM3QyxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztZQUN0QyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLHVCQUFVLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN0SSxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUNuQztZQUNFLHFFQUFxRTtZQUNyRSx5Q0FBeUM7WUFDekMsSUFBSSxTQUFTLEdBQUcsdUJBQVUsQ0FBQyx1QkFBdUIsQ0FDOUMsV0FBVyxDQUFDLGFBQWEsRUFDekIsUUFBUSxFQUNSLElBQUksRUFDSixJQUFJLENBQ1AsQ0FBQztZQUNGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2xELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFFRCxJQUFJLEtBQUssR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FDMUIsV0FBVyxDQUFDLGFBQWEsRUFDekIsMEJBQTBCLEVBQzFCLElBQUksQ0FDUCxDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDUixLQUFLLEdBQUcsbUJBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDL0MscUJBQVMsQ0FBQyxRQUFRLENBQ2QsV0FBVyxDQUFDLGFBQWEsRUFDekIsMEJBQTBCLEVBQzFCLEtBQUssQ0FDUixDQUFDO2FBQ0w7WUFDRCxJQUFJLE9BQU8sR0FBRyxtQkFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRCxJQUFJLE1BQU0sR0FDTixPQUFPLEtBQUssRUFBRTtnQkFDZCxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDeEM7aUJBQU07Z0JBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzdCO1NBQ0o7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ2hHRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELHVGQUEwQztBQUU3Qiw0QkFBb0IsR0FBUztJQUN0QyxFQUFFLEVBQUUsc0JBQXNCO0lBQzFCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFFBQVEsRUFBRTtRQUNOLCtCQUErQixFQUFFO1lBQzdCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLHFCQUFxQjtTQUN4QjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLDJCQUEyQjtZQUNyQyxRQUFRLEVBQUUsMkJBQTJCO1lBQ3JDLHlDQUF5QztZQUN6QyxPQUFPLEVBQUUsMkJBQTJCO1NBQ3ZDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsb0RBQW9EO1lBQzlELGtHQUFrRztZQUNsRyxPQUFPLEVBQUUsZ0ZBQWdGO1NBQzVGO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpELElBQUksTUFBTSxHQUFHLG1CQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RHLElBQUksTUFBTSxFQUFFO1lBQ1IsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQy9ERDs7Ozs7Ozs7Ozs7K0VBVytFOzs7QUFFL0UsK0VBQXNIO0FBQ3RILCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFFL0IseUJBQWlCLEdBQVM7SUFDbkMsRUFBRSxFQUFFLG1CQUFtQjtJQUN2QixPQUFPLEVBQUUsYUFBYTtJQUN0QixRQUFRLEVBQUU7UUFDTixvQkFBb0IsRUFBRTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixhQUFhLEVBQUUsYUFBYTtTQUMvQjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxRQUFRLEVBQUUsd0JBQXdCO1lBQ2xDLFFBQVEsRUFBRSx3QkFBd0I7WUFDbEMsYUFBYSxFQUFFLHdCQUF3QjtTQUMxQztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLDBEQUEwRDtZQUNuRSxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsMkVBQTJFO1lBQ3JGLGFBQWEsRUFBRSx1RkFBdUY7U0FDekc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDeEYsR0FBRyxFQUFFLE9BQU87WUFDWixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDeEMsQ0FBQztJQUNGLHFCQUFxQjtJQUNyQixHQUFHLEVBQUUsUUFBUTtJQUNiLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEUsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0QixPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxFQUFFO1lBQzdHLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLFlBQVksR0FBRyxtQkFBUSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzFDLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQzthQUN6QjtZQUNELElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ3RDLE9BQU8sb0JBQVEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RDtpQkFBTSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNoQyxPQUFPLHlCQUFhLEVBQUMsYUFBYSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakU7U0FDSjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDMUVEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1Qyw2RkFBOEM7QUFFakMsMkJBQW1CLEdBQVM7SUFDckMsRUFBRSxFQUFFLHFCQUFxQjtJQUN6QixPQUFPLEVBQUUsYUFBYTtJQUN0QixJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsMEJBQTBCO1lBQ2xDLGdCQUFnQixFQUFFLDBCQUEwQjtZQUM1QyxPQUFPLEVBQUUsMEJBQTBCO1NBQ3RDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUseUZBQXlGO1lBQ2pHLGdCQUFnQixFQUFFLG9HQUFvRztZQUN0SCxPQUFPLEVBQUUsZ0dBQWdHO1NBQzVHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixDQUFDO1lBQ3JELEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNmLE9BQU8sRUFBRSxtQkFBVyxDQUFDLGNBQWM7WUFDbkMsY0FBYyxFQUFFLHFCQUFhLENBQUMsV0FBVztTQUM1QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpELElBQUksU0FBUyxHQUFHLG1CQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFakQsMEZBQTBGO1FBQzFGLElBQUksWUFBWSxHQUFHLG1CQUFRLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxZQUFZO1lBQ2IsT0FBTyxJQUFJLENBQUM7UUFFaEIsd0ZBQXdGO1FBQ3hGLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN2QyxJQUFJLFVBQVUsR0FBRyxxQkFBUyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDakUsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDNUMsT0FBTyxJQUFJLENBQUM7U0FDbkI7UUFFRCxJQUFJLGFBQWEsR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUMzQyxPQUFPLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0IsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7Z0JBRTNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQVEsRUFBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEU7UUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNkLE9BQU8sR0FBRyxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUM1RUQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUFrSTtBQUNsSSwrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBQzVDLGdHQUFnRDtBQUNoRCw2RkFBOEM7QUFFakMsZ0NBQXdCLEdBQVM7SUFDMUMsRUFBRSxFQUFFLDBCQUEwQjtJQUM5QixPQUFPLEVBQUUsYUFBYTtJQUN0QixRQUFRLEVBQUU7UUFDTixrQ0FBa0MsRUFBRTtZQUNoQyxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLCtCQUErQjtZQUN6QyxRQUFRLEVBQUUsK0JBQStCO1lBQ3pDLE9BQU8sRUFBRSwrQkFBK0I7U0FDM0M7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSxrRUFBa0U7WUFDNUUsT0FBTyxFQUFFLHVGQUF1RjtTQUNuRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBRW5ELHFFQUFxRTtRQUNyRSxJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLHVCQUF1QixDQUM5QyxXQUFXLENBQUMsYUFBYSxFQUN6QixRQUFRLEVBQ1IsSUFBSSxFQUNKLElBQUksQ0FDUCxDQUFDO1FBQ0YsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQzFCLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLDBCQUEwQixFQUMxQixJQUFJLENBQ1AsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixLQUFLLEdBQUcsbUJBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQyxxQkFBUyxDQUFDLFFBQVEsQ0FDZCxXQUFXLENBQUMsYUFBYSxFQUN6QiwwQkFBMEIsRUFDMUIsS0FBSyxDQUNSLENBQUM7U0FDTDtRQUNELElBQUksT0FBTyxHQUFHLG1CQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELElBQUksTUFBTSxHQUNOLE9BQU8sS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVuRSx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sb0JBQVEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3RGRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBRW5DLHVCQUFlLEdBQVM7SUFDakMsRUFBRSxFQUFFLGlCQUFpQjtJQUNyQixPQUFPLEVBQUUsT0FBTztJQUNoQixZQUFZLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztJQUN4QyxRQUFRLEVBQUU7UUFDTixxQkFBcUIsRUFBRTtZQUNuQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUNyQjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLHNCQUFzQjtZQUNoQyxRQUFRLEVBQUUsc0JBQXNCO1lBQ2hDLFFBQVEsRUFBRSxzQkFBc0I7WUFDaEMsT0FBTyxFQUFFLHNCQUFzQjtTQUNsQztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsUUFBUSxFQUFFLHdEQUF3RDtZQUNsRSxRQUFRLEVBQUUseUhBQXlIO1lBQ25JLE9BQU8sRUFBRSxxRUFBcUU7U0FDakY7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hELGdEQUFnRDtRQUNoRCxJQUFJLFdBQVcsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QjtZQUNsRCxPQUFPLElBQUksQ0FBQztRQUVoQixlQUFlO1FBQ2YseUZBQXlGO1FBQ3pGLElBQU0sY0FBYyxHQUFHLG1CQUFRLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckUsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0QsSUFBTSxlQUFlLEdBQUcsbUJBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRSxJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvRCxJQUFNLG9CQUFvQixHQUFHLG1CQUFRLENBQUMsMkJBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0UsSUFBSSxvQkFBb0IsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpFLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdEMsSUFBSSxVQUFVLEdBQUcsdUJBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2xFLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzVDLE9BQU8sSUFBSSxDQUFDO1NBQ25CO1FBRUQsSUFBSSxRQUFRLEdBQWEsbUJBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUksQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQztRQUVoQixpQ0FBaUM7UUFDakMsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUM1QixPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFcEQsSUFBSSxZQUFZLEdBQUcsbUJBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUksQ0FBQztZQUNqRCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTlELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLHVCQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUM1RyxPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWxFLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3ZCLE9BQU8sb0JBQVEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFbEUsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbkIsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUU5RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0o7QUFFRCwrRkFBK0Y7QUFDL0YsbUdBQW1HO0FBQ25HLDRCQUE0QjtBQUNmLDRCQUFvQixHQUFTO0lBQ3RDLEVBQUUsRUFBRSxzQkFBc0I7SUFDMUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsMkRBQTJEO0lBQzNELFlBQVksRUFBRSxDQUFDLDJCQUEyQixFQUFFLGlCQUFpQixDQUFDO0lBQzlELFFBQVEsRUFBRTtRQUNOLHdCQUF3QixFQUFFO1lBQ3RCLE1BQU0sRUFBRSxNQUFNO1lBQ2Qsd0JBQXdCLEVBQUUsd0JBQXdCO1lBQ2xELGlDQUFpQyxFQUFFLGlDQUFpQztTQUN2RTtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLDJCQUEyQjtZQUNwQyxNQUFNLEVBQUUsMkJBQTJCO1lBQ25DLHdCQUF3QixFQUFFLDJCQUEyQjtZQUNyRCxpQ0FBaUMsRUFBRSwyQkFBMkI7U0FDakU7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSwwRkFBMEY7WUFDbkcsTUFBTSxFQUFFLHlEQUF5RDtZQUNqRSx3QkFBd0IsRUFBRSx3RkFBd0Y7WUFDbEgsaUNBQWlDLEVBQUUsaUdBQWlHO1NBQ3ZJO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNmLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxFQUFDLEVBQUMsQ0FBQztJQUM1SCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCx3QkFBd0I7UUFDeEIsSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUI7WUFDbEQsT0FBTyxJQUFJLENBQUM7UUFFaEIsOEJBQThCO1FBQzlCLElBQUksY0FBYyxHQUFZLG1CQUFRLENBQUMsNEJBQTRCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakYsSUFBSSxjQUFjLEtBQUssSUFBSSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLEtBQUssR0FBYSxtQkFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQiwwRkFBMEY7WUFDMUYsSUFBSSxDQUFDLG1CQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztnQkFDaEMsT0FBTyxJQUFJLENBQUM7U0FDbkI7YUFBTTtZQUNILDBCQUEwQjtZQUMxQixLQUFLLEdBQUksbUJBQVEsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0MsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUNwQjtRQUVELElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsSUFBSSxnQkFBZ0IsR0FBRyxtQkFBUSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNsRCxPQUFPLG9CQUFRLEVBQUMsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFcEYsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNsQixJQUFJLFFBQVE7Z0JBQ1IsT0FBTyxvQkFBUSxFQUFDLHdCQUF3QixFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRXBHLE9BQU8sb0JBQVEsRUFBQyxpQ0FBaUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEg7UUFFRCxPQUFPLG9CQUFRLEVBQUMsd0JBQXdCLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUMvS0Q7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBQzVDLGdHQUFnRDtBQUNoRCw2RkFBOEM7QUFFakMsaUNBQXlCLEdBQVM7SUFDM0MsRUFBRSxFQUFFLDJCQUEyQjtJQUMvQixPQUFPLEVBQUUsY0FBYztJQUN2QixRQUFRLEVBQUU7UUFDTixxQ0FBcUMsRUFBRTtZQUNuQyxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGdDQUFnQztZQUMxQyxRQUFRLEVBQUUsZ0NBQWdDO1lBQzFDLE9BQU8sRUFBRSxnQ0FBZ0M7U0FDNUM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSxvRUFBb0U7WUFDOUUsT0FBTyxFQUFFLHdGQUF3RjtTQUNwRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQzFDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELHFFQUFxRTtRQUNyRSx5Q0FBeUM7UUFDekMsSUFBSSxTQUFTLEdBQUcsdUJBQVUsQ0FBQyx1QkFBdUIsQ0FDOUMsV0FBVyxDQUFDLGFBQWEsRUFDekIsU0FBUyxFQUNULElBQUksRUFDSixJQUFJLENBQ1AsQ0FBQztRQUNGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksS0FBSyxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUMxQixXQUFXLENBQUMsYUFBYSxFQUN6QiwyQkFBMkIsRUFDM0IsSUFBSSxDQUNQLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1IsS0FBSyxHQUFHLG1CQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0MscUJBQVMsQ0FBQyxRQUFRLENBQ2QsV0FBVyxDQUFDLGFBQWEsRUFDekIsMkJBQTJCLEVBQzNCLEtBQUssQ0FDUixDQUFDO1NBQ0w7UUFDRCxJQUFJLE9BQU8sR0FBRyxtQkFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLE1BQU0sR0FDTixPQUFPLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sb0JBQVEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3JGRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELHNHQUFzRDtBQUN0RCw0SUFBNEU7QUFDNUUscUhBQWdFO0FBQ2hFLDJGQUErQztBQUVsQyw0QkFBb0IsR0FBUztJQUN0QyxFQUFFLEVBQUUsc0JBQXNCO0lBQzFCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFFBQVEsRUFBRTtRQUNOLGdDQUFnQyxFQUFFO1lBQzlCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQ3JCO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsMkJBQTJCO1lBQ3BDLFFBQVEsRUFBRSwyQkFBMkI7WUFDckMsUUFBUSxFQUFFLDJCQUEyQjtTQUN4QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLG9FQUFvRTtZQUM3RSxRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsNkZBQTZGO1NBQzFHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsMEhBQTBIO1FBQzFILElBQ0ksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUM3QixXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFFBQVEsQ0FBQztZQUNsRCxDQUFDLG1CQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQztnQkFDbEQsQ0FBQyxDQUNHLG1CQUFRLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQztvQkFDbkQsbUJBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQ3hELENBQUMsRUFDUjtZQUNFLG9GQUFvRjtZQUNwRixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxRQUFRLEdBQUcsdUJBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEQsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVqRCxnQ0FBZ0M7UUFDaEMsSUFBSSxTQUFTLEdBQUc7WUFDWixRQUFRO1lBQ1IsVUFBVTtZQUNWLFVBQVU7WUFDVixTQUFTO1lBQ1Qsa0JBQWtCO1lBQ2xCLGVBQWU7WUFDZixPQUFPO1lBQ1AsV0FBVztZQUNYLFFBQVE7WUFDUixZQUFZO1lBQ1osUUFBUTtZQUNSLFNBQVM7WUFDVCxhQUFhO1lBQ2IsTUFBTTtTQUNULENBQUM7UUFDRixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDOUMsSUFDSSxPQUFPLEtBQUssUUFBUTtZQUNwQixDQUFDLE9BQU8sS0FBSyxPQUFPO2dCQUNoQixXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQyxFQUNsRDtTQUNEO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbkMsd0ZBQXdGO1lBQ3hGLElBQUksWUFBWSxHQUFHO2dCQUNmLE9BQU87Z0JBQ1AsVUFBVTtnQkFDVixRQUFRO2dCQUNSLFFBQVE7Z0JBQ1IsVUFBVTtnQkFDVixVQUFVO2dCQUNWLFFBQVE7Z0JBQ1IsUUFBUTtnQkFDUixRQUFRO2dCQUNSLFVBQVU7Z0JBQ1YsT0FBTzthQUNWLENBQUM7WUFDRixJQUNJLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDeEQsQ0FBQyxDQUFDLEVBQ0o7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNKO1FBRUQsaURBQWlEO1FBQ2pELElBQUksWUFBWSxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxtQkFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDM0QsSUFBSSxVQUFVLEdBQUcsdUJBQVUsQ0FBQyx1QkFBdUIsQ0FDL0MsV0FBVyxDQUFDLGFBQWEsRUFDekIsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLENBQ1AsQ0FBQztnQkFDRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDeEMsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QixJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLG1CQUFtQixDQUMxQyxRQUFRLEVBQ1IsV0FBVyxDQUNkLENBQUM7b0JBQ0YsSUFBSSxTQUFTLEVBQUU7d0JBQ1gsSUFBSSxJQUFJLEdBQUcsdUJBQVUsQ0FBQyxnQkFBZ0IsQ0FDbEMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUNuQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDbEMsSUFBSSxLQUFLLEdBQUcsdUJBQVksQ0FBQyxPQUFPLENBQzVCLFdBQVcsRUFDWCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1YsQ0FBQzs0QkFDRixJQUFJLEtBQUssS0FBSyxXQUFXLEVBQUU7Z0NBQ3ZCLE9BQU8sSUFBSSxDQUFDOzZCQUNmO3lCQUNKO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtRQUVELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxjQUFjLEdBQUcsaUNBQWUsQ0FBQyxjQUFjLENBQUM7UUFDcEQsZ0RBQWdEO1FBQ2hELElBQUksS0FBSyxHQUFHLG1CQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJLG9CQUFvQixHQUFHLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLFFBQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUM5RCxJQUFJLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdkMsSUFDSSxPQUFPO2dCQUNQLE9BQU8sQ0FBQyxZQUFZO2dCQUNwQixPQUFPLENBQUMsUUFBUTtnQkFDaEIsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFDakQ7Z0JBQ0UsRUFBRSxnQkFBZ0IsQ0FBQztnQkFFbkIsMkRBQTJEO2dCQUMzRCxnRUFBZ0U7Z0JBQ2hFLHNFQUFzRTtnQkFDdEUsTUFBTTtvQkFDRixtQkFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7d0JBQ2xDLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQzt3QkFDbEQsdUJBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRTNELElBQ0ksQ0FBQyxNQUFNO29CQUNQLE9BQU8sQ0FBQyxRQUFRO29CQUNoQixPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQzNDO29CQUNFLHNFQUFzRTtvQkFDdEUsbUNBQW1DO29CQUNuQyxNQUFNLEdBQUcsdUJBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDekQ7Z0JBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDVCx1RUFBdUU7b0JBQ3ZFLE1BQU0sR0FBRyx1QkFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUNyRDtnQkFFRCxJQUNJLENBQUMsTUFBTTtvQkFDUCxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUs7b0JBQzNDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQ2pDLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQ2pDO29CQUNFLE1BQU07d0JBQ0YsaUJBQU8sQ0FBQyxlQUFlLENBQ25CLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQ2xDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDM0I7Z0JBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzdDLFVBQVUsR0FBRyxJQUFJLENBQUM7aUJBQ3JCO2FBQ0o7U0FDSjtRQUVELElBQUksZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7YUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLE9BQU8sb0JBQVEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDSCxNQUFNO1lBQ04sbUNBQW1DO1lBQ25DLGdEQUFnRDtZQUNoRCwwQkFBMEI7WUFDMUIsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLG1CQUFtQjtTQUN0QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDaE9EOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBNEc7QUFDNUcsZ0dBQWdEO0FBRW5DLDJCQUFtQixHQUFTO0lBQ3JDLEVBQUUsRUFBRSxxQkFBcUI7SUFDekIsT0FBTyxFQUFFLDhDQUE4QztJQUN2RCxRQUFRLEVBQUU7UUFDTixrQkFBa0IsRUFBRTtZQUNoQixRQUFRLEVBQUUsUUFBUTtZQUNsQixhQUFhLEVBQUUsYUFBYTtTQUFDO0tBQ3BDO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLDBCQUEwQjtZQUNwQyxhQUFhLEVBQUUsMEJBQTBCO1lBQ3pDLE9BQU8sRUFBRSwwQkFBMEI7U0FDdEM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLGFBQWEsRUFBRSw4Q0FBOEM7WUFDN0QsT0FBTyxFQUFFLHdDQUF3QztTQUNwRDtLQUNKO0lBQ0Q7Ozs7Ozs7O01BUUU7SUFDRixRQUFRLEVBQUUsRUFBRTtJQUNaLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFFbkQseUdBQXlHO1FBQ3pHLHdHQUF3RztRQUN4Ryw0SEFBNEg7UUFDNUgsc0dBQXNHO1FBQ3RHLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLElBQUksV0FBVyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksTUFBTSxDQUFDO2dCQUM3RixXQUFXLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ25ELHVCQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFBRTtnQkFFN0MsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzdCO1NBQ0o7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxRQUFRLEdBQUcsdUJBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQsSUFBSSw0QkFBNEIsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBRXZCLG1DQUFtQztRQUNuQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO1lBQ3hELElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLDZDQUE2QztZQUM3QyxJQUFJLG1DQUFtQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDakQsaUNBQWlDO2dCQUNqQyxJQUFJLGFBQWEsSUFBSSxLQUFLLEVBQUU7b0JBQ3hCLHlCQUF5QixHQUFHLHlCQUF5QixHQUFHLENBQUMsQ0FBQztvQkFBQSxDQUFDO2lCQUM5RDtxQkFBTTtvQkFDSCx5QkFBeUIsR0FBRyxDQUFDLENBQUM7aUJBQ2pDO2FBQ0o7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN6Qix5QkFBeUIsR0FBRyxDQUFDLENBQUM7YUFDakM7aUJBQU07Z0JBQ0gsNEJBQTRCLEdBQUcsNEJBQTRCLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7YUFDakM7WUFDRCxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBRXRCLG9CQUFvQjtZQUNwQixJQUFJLDRCQUE0QixJQUFJLENBQUMsSUFBSSx5QkFBeUIsSUFBSSxDQUFDLEVBQUU7Z0JBQ3JFLE1BQU0sR0FBRyxLQUFLLENBQUM7YUFDbEI7U0FDSjtRQUNELElBQUksTUFBTTtZQUFFLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8seUJBQWEsRUFBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ2xHRDs7Ozs7Ozs7Ozs7K0VBVytFOzs7QUFFL0UsK0VBQTRHO0FBQzVHLCtFQUEwRDtBQUMxRCxnR0FBZ0Q7QUFFbkMsd0JBQWdCLEdBQVM7SUFDbEMsRUFBRSxFQUFFLGtCQUFrQjtJQUN0QixPQUFPLEVBQUUseUJBQXlCO0lBQ2xDLFFBQVEsRUFBRTtRQUNOLHVCQUF1QixFQUFFO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGFBQWEsRUFBRSxhQUFhO1NBQy9CO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLFFBQVEsRUFBRSx1QkFBdUI7WUFDakMsYUFBYSxFQUFFLHVCQUF1QjtTQUN6QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLCtGQUErRjtZQUN4RyxRQUFRLEVBQUUsYUFBYTtZQUN2QixhQUFhLEVBQUUsNkdBQTZHO1NBQy9IO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3ZGLEdBQUcsRUFBRSxPQUFPO1lBQ1osS0FBSyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM1QixZQUFZLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQ3hDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksU0FBUyxHQUFHLHVCQUFVLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNuQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNqRDtRQUVELElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLE1BQU07WUFBRSxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLHlCQUFhLEVBQUMsYUFBYSxDQUFDLENBQUM7SUFDckQsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUMxREQ7Ozs7Ozs7Ozs7OytFQVcrRTs7O0FBRS9FLCtFQUE2RjtBQUM3RiwrRUFBMEQ7QUFFN0MsNkJBQXFCLEdBQVM7SUFDdkMsRUFBRSxFQUFFLHVCQUF1QjtJQUMzQixPQUFPLEVBQUUsV0FBVztJQUNwQixRQUFRLEVBQUU7UUFDTiw0QkFBNEIsRUFBRTtZQUMxQixRQUFRLEVBQUUsUUFBUTtTQUNyQjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLDRCQUE0QjtZQUNyQyxRQUFRLEVBQUUsNEJBQTRCO1NBQ3pDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsbURBQW1EO1lBQzVELFFBQVEsRUFBRSx3Q0FBd0M7U0FDckQ7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUUsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDeEYsR0FBRyxFQUFFLE9BQU87WUFDWixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDeEMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLHNEQUFzRDtRQUN0RCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUMvQ0Q7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUE0RztBQUM1RywrRUFBMEQ7QUFDMUQsZ0dBQWdEO0FBRW5DLDhCQUFzQixHQUFTO0lBQ3hDLEVBQUUsRUFBRSx3QkFBd0I7SUFDNUIsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixRQUFRLEVBQUU7UUFDTix3QkFBd0IsRUFBRTtZQUN0QixRQUFRLEVBQUUsUUFBUTtZQUNsQixhQUFhLEVBQUUsYUFBYTtTQUFDO0tBQ3BDO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLDZCQUE2QjtZQUN2QyxhQUFhLEVBQUUsNkJBQTZCO1lBQzVDLE9BQU8sRUFBRSw2QkFBNkI7U0FDekM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLGFBQWEsRUFBRSw4RkFBOEY7WUFDN0csT0FBTyxFQUFFLHVEQUF1RDtTQUNuRTtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksTUFBTSxHQUFHLHVCQUFVLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxJQUFJLFNBQVMsR0FBRyx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRSxNQUFNLEdBQUcsU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksTUFBTTtZQUFFLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8seUJBQWEsRUFBQyxhQUFhLENBQUMsQ0FBQztJQUVyRCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3pERDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXlHO0FBQ3pHLCtFQUEwRDtBQUMxRCx1RkFBMEM7QUFFN0IsZ0NBQXdCLEdBQVM7SUFDMUMsRUFBRSxFQUFFLDBCQUEwQjtJQUM5QixPQUFPLEVBQUUsWUFBWTtJQUNyQixRQUFRLEVBQUU7UUFDTixhQUFhLEVBQUU7WUFDWCxRQUFRLEVBQUUsUUFBUTtZQUNsQixVQUFVLEVBQUUsVUFBVTtTQUFDO0tBQzlCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLCtCQUErQjtZQUN6QyxVQUFVLEVBQUUsK0JBQStCO1lBQzNDLE9BQU8sRUFBRSwrQkFBK0I7U0FDM0M7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFVBQVUsRUFBRSw4Q0FBOEM7WUFDMUQsT0FBTyxFQUFFLDRDQUE0QztTQUN4RDtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUNsQyxPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsZUFBZTtRQUNmLElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDckQsSUFBSSxNQUFNO1lBQUUsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxzQkFBVSxFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdEREOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBNEc7QUFDNUcsK0VBQTBEO0FBRTdDLDRCQUFvQixHQUFTO0lBQ3RDLEVBQUUsRUFBRSxzQkFBc0I7SUFDMUIsT0FBTyxFQUFFLFdBQVc7SUFDcEIsUUFBUSxFQUFFO1FBQ04sdUJBQXVCLEVBQUU7WUFDckIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsYUFBYSxFQUFFLGFBQWE7U0FBQztLQUNwQztJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSwyQkFBMkI7WUFDckMsYUFBYSxFQUFFLDJCQUEyQjtZQUMxQyxPQUFPLEVBQUUsMkJBQTJCO1NBQ3ZDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsYUFBYTtZQUN2QixhQUFhLEVBQUUsZ0hBQWdIO1lBQy9ILE9BQU8sRUFBRSxpRkFBaUY7U0FDN0Y7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQXdCLENBQUM7UUFDNUQsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRW5CLG1EQUFtRDtRQUNuRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssTUFBTSxFQUFFO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsQ0FBQztTQUNwRTtRQUNELHdDQUF3QztRQUN4QyxJQUFJLFdBQVcsQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7YUFDcEU7U0FDSjtRQUVELElBQUksTUFBTSxFQUFFO1lBQ1IsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO2FBQU07WUFDSCxPQUFPLHlCQUFhLEVBQUMsYUFBYSxDQUFDLENBQUM7U0FDdkM7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3hFRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsNElBQTRFO0FBQzVFLGlHQUFtRDtBQUNuRCw2RkFBOEM7QUFDOUMsdUZBQTBDO0FBRTdCLGtDQUEwQixHQUFTO0lBQzVDLEVBQUUsRUFBRSw0QkFBNEI7SUFDaEMsT0FBTyxFQUFFLGVBQWU7SUFDeEIsWUFBWSxFQUFFLENBQUMsMEJBQTBCLENBQUM7SUFDMUMsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLGlDQUFpQztZQUN6QyxjQUFjLEVBQUUsaUNBQWlDO1lBQ2pELG1CQUFtQixFQUFFLGlDQUFpQztZQUN0RCwwQkFBMEIsRUFBRSxpQ0FBaUM7WUFDN0QsMEJBQTBCLEVBQUUsaUNBQWlDO1lBQzdELE9BQU8sRUFBRSxpQ0FBaUM7U0FDN0M7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSxpRUFBaUU7WUFDekUsY0FBYyxFQUFFLDBFQUEwRTtZQUMxRixtQkFBbUIsRUFBRSxzSEFBc0g7WUFDM0ksMEJBQTBCLEVBQUUsdUtBQXVLO1lBQ25NLDBCQUEwQixFQUFFLDBHQUEwRztZQUN0SSxPQUFPLEVBQUUsa0hBQWtIO1NBQzlIO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDckIsZ0JBQVksR0FBYyxVQUFVLGFBQXhCLEVBQUUsT0FBTyxHQUFLLFVBQVUsUUFBZixDQUFnQjtRQUM3QyxrRkFBa0Y7UUFDbEYsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFL0IsOERBQThEO1FBQzlELElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLFVBQVUsR0FBRyx1QkFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNiLE9BQU8sb0JBQVEsRUFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRWxCLHVCQUF1QjtRQUN2QixJQUFJLFlBQVksRUFBRTtZQUNkLHdDQUF3QztZQUN4QyxJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxZQUFZLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFO2dCQUM5RixJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzFELEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQztpQkFDckQ7YUFDSjtTQUNKO1FBRUQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25FO1FBRUQsSUFBSSxXQUFXLEdBQUcsbUJBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUMsU0FBUyxJQUFLLGtCQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUEvQixDQUErQixDQUFDLENBQUM7UUFDbEgsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMsMEJBQTBCLEVBQUUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4RjtRQUVELElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLEVBQUU7WUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBUSxFQUFDLDBCQUEwQixFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQixPQUFPLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0I7YUFBTTtZQUNILE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUM3R0Q7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsaUdBQW1EO0FBQ25ELDZGQUE4QztBQUM5Qyx1RkFBMEM7QUFFN0IsbUNBQTJCLEdBQVM7SUFDN0MsRUFBRSxFQUFFLDZCQUE2QjtJQUNqQyxPQUFPLEVBQUUsZUFBZTtJQUN4QixZQUFZLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztJQUMxQyxRQUFRLEVBQUU7UUFDTix1QkFBdUIsRUFBRTtZQUNyQixNQUFNLEVBQUUsTUFBTTtZQUNkLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGFBQWEsRUFBRSxhQUFhO1NBQUM7S0FDcEM7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsa0NBQWtDO1lBQzFDLFFBQVEsRUFBRSxrQ0FBa0M7WUFDNUMsYUFBYSxFQUFFLGtDQUFrQztZQUNqRCxPQUFPLEVBQUUsa0NBQWtDO1NBQzlDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsZ0lBQWdJO1lBQ3hJLFFBQVEsRUFBRSx5SEFBeUg7WUFDbkksYUFBYSxFQUFFLDJGQUEyRjtZQUMxRyxPQUFPLEVBQUUsMExBQTBMO1NBQ3RNO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDckIsV0FBTyxHQUFtQixVQUFVLFFBQTdCLEVBQUUsWUFBWSxHQUFLLFVBQVUsYUFBZixDQUFnQjtRQUM3QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEtBQUssUUFBUSxFQUFFO1lBQzVELE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQVEsRUFBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHVCQUF1QjtRQUN2QixJQUFJLFlBQVksSUFBSSxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNyRCxpREFBaUQ7WUFDakQsTUFBTSxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3pELHVEQUF1RDtZQUN2RCxJQUFJLE1BQU0sSUFBSSxZQUFZLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDckUsd0NBQXdDO2dCQUN4QyxJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sTUFBTSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDNUIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksaUJBQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUMxRCxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7d0JBQ3RELElBQUksRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxnQkFBZ0I7NEJBQUUsTUFBTTtxQkFDdEU7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQVEsRUFBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25CLE9BQU8sTUFBTSxDQUFDO1NBQ2pCO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzVGRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELHVGQUEwQztBQUMxQyw2RkFBOEM7QUFFOUMsU0FBUyxhQUFhLENBQUMsSUFBYTtJQUNoQywrREFBK0Q7SUFDL0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsRUFBRTtRQUNyRixPQUFPLFVBQVUsQ0FBQztLQUNyQjtTQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPO1dBQzNDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxDQUFDO1dBQ3BFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQzFFLDRGQUE0RjtRQUM1RixPQUFPLEtBQUssQ0FBQztLQUNoQjtTQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxPQUFPO1dBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQzFFLHNGQUFzRjtRQUN0RixPQUFPLEtBQUssQ0FBQztLQUNoQjtJQUNELHNEQUFzRDtJQUN0RCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRVksNkJBQXFCLEdBQVM7SUFDdkMsRUFBRSxFQUFFLHVCQUF1QjtJQUMzQixPQUFPLEVBQUUsZUFBZTtJQUN4QixRQUFRLEVBQUU7UUFDTixrQkFBa0IsRUFBRTtZQUNoQixVQUFVLEVBQUUsVUFBVTtZQUN0QixVQUFVLEVBQUUsVUFBVTtZQUN0QixVQUFVLEVBQUUsVUFBVTtTQUFDO0tBQzlCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsVUFBVSxFQUFFLDRCQUE0QjtZQUN4QyxVQUFVLEVBQUUsNEJBQTRCO1lBQ3hDLFVBQVUsRUFBRSw0QkFBNEI7WUFDeEMsT0FBTyxFQUFFLDRCQUE0QjtTQUN4QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsVUFBVSxFQUFFLG1GQUFtRjtZQUMvRixVQUFVLEVBQUUsdUZBQXVGO1lBQ25HLFVBQVUsRUFBRSxxREFBcUQ7WUFDakUsT0FBTyxFQUFFLHdEQUF3RDtTQUNwRTtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQzFDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMvRSxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpDLDhDQUE4QztRQUM5QyxJQUFJLE9BQU8sS0FBSyxVQUFVLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxtQkFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUM7UUFDL0csSUFBSSxRQUFRLEdBQUcsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBRXZJLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDbEMsSUFBSSxHQUFHLEVBQUU7WUFDTCxJQUFJLEtBQUssR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUc7Z0JBQ1QsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUM3QyxTQUFTLEVBQUUsT0FBTztnQkFDbEIsVUFBVSxFQUFFLFFBQVE7YUFDdkIsQ0FBQztZQUNGLHFCQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3BFO2FBQU07WUFDSCxZQUFZO1lBQ1osT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtZQUNuQixPQUFPLG9CQUFRLEVBQUMsVUFBVSxDQUFDLENBQUM7U0FDL0I7YUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7WUFDMUIsT0FBTyxvQkFBUSxFQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQy9CO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFO1lBQzFCLE9BQU8sb0JBQVEsRUFBQyxVQUFVLENBQUMsQ0FBQztTQUMvQjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDN0dEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELGlHQUFtRDtBQUNuRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELDZGQUE4QztBQUM5Qyx1RkFBMEM7QUFFN0IsbUNBQTJCLEdBQVM7SUFDN0MsRUFBRSxFQUFFLDZCQUE2QjtJQUNqQyxPQUFPLEVBQUUsZUFBZTtJQUN4QixZQUFZLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztJQUMxQyxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsa0NBQWtDO1lBQzFDLG1CQUFtQixFQUFFLGtDQUFrQztZQUN2RCxxQkFBcUIsRUFBRSxrQ0FBa0M7WUFDekQsT0FBTyxFQUFFLGtDQUFrQztTQUM5QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLCtEQUErRDtZQUN2RSxtQkFBbUIsRUFBRSwyREFBMkQ7WUFDaEYscUJBQXFCLEVBQUUsc0dBQXNHO1lBQzdILE9BQU8sRUFBRSwwR0FBMEc7U0FDdEg7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQWUsQ0FBQztRQUNuRCxJQUFJLEtBQUssR0FBRyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNyQixnQkFBWSxHQUFlLFVBQVUsYUFBekIsRUFBRSxRQUFRLEdBQUssVUFBVSxTQUFmLENBQWdCO1FBQzlDLGtGQUFrRjtRQUNsRix1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUUvQixJQUFNLFNBQVMsR0FBRyxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0QsSUFBSSxNQUFNLEdBQUcsRUFBRTtRQUNmLElBQUksQ0FBQyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsb0RBQW9EO1FBQ3BELHlGQUF5RjtRQUN6RixJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUM5QyxPQUFPLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0I7UUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFFbEIsdUJBQXVCO1FBQ3ZCLElBQUksWUFBWSxJQUFLLGlCQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3RELHFEQUFxRDtZQUNyRCxNQUFNLEdBQUcsQ0FBQyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLHVCQUF1QixDQUFDLENBQUM7WUFBQSxDQUFDO1lBQ3BILHVEQUF1RDtZQUN2RCxJQUFJLE1BQU0sSUFBSSxZQUFZLENBQUMsUUFBUSxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDckUsd0NBQXdDO2dCQUN4QyxJQUFJLEVBQUUsR0FBRyxJQUFJLHFCQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sTUFBTSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtvQkFDNUIsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksaUJBQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUMxRCxNQUFNLEdBQUcsQ0FBQyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUNwQyxDQUFDLG1CQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO3dCQUNqRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsZ0JBQWdCOzRCQUFFLE1BQU07cUJBQ3RFO2lCQUNKO2FBQ0o7U0FDSjtRQUVELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyQixPQUFPLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0I7YUFBTTtZQUNILE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUN0R0Q7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsMEZBQTRDO0FBQzVDLDZGQUE4QztBQUVqQywrQkFBdUIsR0FBUztJQUN6QyxFQUFFLEVBQUUseUJBQXlCO0lBQzdCLE9BQU8sRUFBRSxlQUFlO0lBQ3hCLFlBQVksRUFBRSxDQUFDLDBCQUEwQixDQUFDO0lBQzFDLFFBQVEsRUFBRTtRQUNOLG1CQUFtQixFQUFFO1lBQ2pCLE1BQU0sRUFBRSxNQUFNO1lBQ2QseUJBQXlCLEVBQUUseUJBQXlCO1lBQ3BELG1DQUFtQyxFQUFFLG1DQUFtQztTQUFDO0tBQ2hGO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLDhCQUE4QjtZQUN0Qyx5QkFBeUIsRUFBRSw4QkFBOEI7WUFDekQsbUNBQW1DLEVBQUUsOEJBQThCO1lBQ25FLE9BQU8sRUFBRSw4QkFBOEI7U0FDMUM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSw0R0FBNEc7WUFDcEgseUJBQXlCLEVBQUUsc0hBQXNIO1lBQ2pKLG1DQUFtQyxFQUFFLDBIQUEwSDtZQUMvSixPQUFPLEVBQUUsaUtBQWlLO1NBQzdLO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBTSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3pDLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JCLGdCQUFZLEdBQWMsVUFBVSxhQUF4QixFQUFFLE9BQU8sR0FBSyxVQUFVLFFBQWYsQ0FBZ0I7UUFDN0Msa0ZBQWtGO1FBQ2xGLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9CLDJGQUEyRjtRQUMzRixJQUFJLFVBQVUsR0FBRyxtQkFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxTQUFTLElBQUssaUJBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQTlCLENBQThCLENBQUMsQ0FBQztRQUM3RyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sb0JBQVEsRUFBQyx5QkFBeUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUMvRTthQUFNO1lBQ0gsSUFBSSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksU0FBUyxDQUFDO1lBQ3pFLDRIQUE0SDtZQUM1SCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQzNCLElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUN0RSxPQUFPLG9CQUFRLEVBQUMsbUNBQW1DLEVBQUUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztpQkFDbEY7YUFDSjtTQUNKO1FBQ0QsT0FBTyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDL0VEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDRJQUE0RTtBQUM1RSw2RkFBOEM7QUFDOUMsdUZBQTBDO0FBRTdCLGdDQUF3QixHQUFTO0lBQzFDLEVBQUUsRUFBRSwwQkFBMEI7SUFDOUIsT0FBTyxFQUFFLGVBQWU7SUFDeEIsWUFBWSxFQUFFLENBQUMsdUJBQXVCLENBQUM7SUFDdkMsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLCtCQUErQjtZQUN4QyxtQkFBbUIsRUFBRSwrQkFBK0I7WUFDcEQsb0JBQW9CLEVBQUUsK0JBQStCO1lBQ3JELG1CQUFtQixFQUFFLCtCQUErQjtZQUNwRCxvQkFBb0IsRUFBRSwrQkFBK0I7WUFDckQsdUJBQXVCLEVBQUUsK0JBQStCO1lBQ3hELDJCQUEyQixFQUFFLCtCQUErQjtZQUM1RCxrQ0FBa0MsRUFBRSwrQkFBK0I7WUFDbkUsa0NBQWtDLEVBQUUsK0JBQStCO1lBQ25FLCtCQUErQixFQUFFLCtCQUErQjtZQUNoRSxpQ0FBaUMsRUFBRSwrQkFBK0I7U0FDckU7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSxpSkFBaUo7WUFDMUosbUJBQW1CLEVBQUUsK0VBQStFO1lBQ3BHLG9CQUFvQixFQUFFLDRGQUE0RjtZQUNsSCxtQkFBbUIsRUFBRSxtRkFBbUY7WUFDeEcsb0JBQW9CLEVBQUUsNEZBQTRGO1lBQ2xILHVCQUF1QixFQUFFLCtEQUErRDtZQUN4RiwyQkFBMkIsRUFBRSxtRUFBbUU7WUFDaEcsa0NBQWtDLEVBQUUsd0dBQXdHO1lBQzVJLGtDQUFrQyxFQUFFLDRHQUE0RztZQUNoSiwrQkFBK0IsRUFBRSx1RkFBdUY7WUFDeEgsaUNBQWlDLEVBQUUsb0ZBQW9GO1NBQzFIO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxDQUFDO1lBQ0YsUUFBUSxFQUFFO2dCQUNOLG1CQUFtQixFQUFFLE1BQU07Z0JBQzNCLG9CQUFvQixFQUFFLE1BQU07Z0JBQzVCLG1CQUFtQixFQUFFLE1BQU07Z0JBQzNCLG9CQUFvQixFQUFFLE1BQU07Z0JBQzVCLHVCQUF1QixFQUFFLGNBQWM7Z0JBQ3ZDLDJCQUEyQixFQUFFLE1BQU07Z0JBQ25DLGtDQUFrQyxFQUFFLGNBQWM7Z0JBQ2xELGtDQUFrQyxFQUFFLE1BQU07Z0JBQzFDLCtCQUErQixFQUFFLGNBQWM7Z0JBQy9DLGlDQUFpQyxFQUFFLGNBQWM7YUFDcEQ7U0FDSixDQUFDO0lBQ0YsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBTSxLQUFLLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ3pDLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3JCLFdBQU8sR0FBZSxVQUFVLFFBQXpCLEVBQUUsUUFBUSxHQUFLLFVBQVUsU0FBZixDQUFnQjtRQUV6QyxJQUFJLE9BQU8sQ0FBQztRQUNaLElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtZQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDeEMsZ0VBQWdFO2dCQUNoRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFRLEVBQUMsdUJBQXVCLENBQUMsQ0FBQzthQUMvRDtZQUNELE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hELFlBQVksR0FBRyx1QkFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDZixnRUFBZ0U7Z0JBQ2hFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQVEsRUFBQyxrQ0FBa0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDckY7U0FDSjthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDNUMsZ0VBQWdFO2dCQUNoRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFRLEVBQUMsMkJBQTJCLENBQUMsQ0FBQzthQUNuRTtZQUNELE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3BELFlBQVksR0FBRyx1QkFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDZixnRUFBZ0U7Z0JBQ2hFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQVEsRUFBQyxrQ0FBa0MsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDckY7U0FDSjthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELG9FQUFvRTtRQUNwRSxVQUFVLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUM3QixVQUFVLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUd2QyxJQUFJLFFBQVEsSUFBSSxDQUFDLGlCQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2xELE9BQU8sb0JBQVEsRUFBQywrQkFBK0IsQ0FBQyxDQUFDO1NBQ3BEO2FBQU0sSUFBSSxDQUFDLFFBQVEsSUFBSSxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN6RCxPQUFPLG9CQUFRLEVBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUN0RDtRQUVELElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtZQUNuQixJQUFJLFFBQVEsRUFBRTtnQkFDVixPQUFPLG9CQUFRLEVBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUN4QztpQkFBTTtnQkFDSCxPQUFPLG9CQUFRLEVBQUMsb0JBQW9CLENBQUMsQ0FBQzthQUN6QztTQUNKO2FBQU07WUFDSCxJQUFJLFFBQVEsRUFBRTtnQkFDVixPQUFPLG9CQUFRLEVBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUN4QztpQkFBTTtnQkFDSCxPQUFPLG9CQUFRLEVBQUMsb0JBQW9CLENBQUMsQ0FBQzthQUN6QztTQUNKO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUN2SUQ7Ozs7Ozs7Ozs7OytFQVcrRTs7O0FBRy9FLCtFQUEwRDtBQUU3QyxtQkFBVyxHQUFTO0lBQzdCLEVBQUUsRUFBRSxhQUFhO0lBQ2pCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE9BQU8sRUFBRSxFQUFFO1lBQ1gsUUFBUSxFQUFFLEVBQUU7U0FDZjtLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLEVBQUU7WUFDWCxRQUFRLEVBQUUsRUFBRTtTQUNmO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNiLEdBQUcsRUFBRSxHQUFHO1lBQ1IsS0FBSyxFQUFFLG1CQUFXLENBQUMsV0FBVztZQUM5QixZQUFZLEVBQUUscUJBQWEsQ0FBQyxVQUFVO1NBQ3pDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RCxXQUFXLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUM1Q0Q7Ozs7Ozs7Ozs7OytFQVcrRTs7O0FBRy9FLGdHQUFnRDtBQUNoRCwrRUFBNkY7QUFDN0YsK0VBQTBEO0FBRTdDLHlCQUFpQixHQUFTO0lBQ25DLEVBQUUsRUFBRSxtQkFBbUI7SUFDdkIsT0FBTyxFQUFFLE9BQU87SUFDaEIsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLEVBQUU7WUFDWCxRQUFRLEVBQUUsRUFBRTtTQUNmO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsRUFBRTtZQUNYLFFBQVEsRUFBRSxFQUFFO1NBQ2Y7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ2xCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsS0FBSyxFQUFFLG1CQUFXLENBQUMsV0FBVztZQUM5QixZQUFZLEVBQUUscUJBQWEsQ0FBQyxVQUFVO1NBQ3pDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksQ0FBQyx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUNyQyxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsSUFBSSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUUsT0FBTyxvQkFBUSxFQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSTtnQkFDakMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO2dCQUN0QixRQUFRLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDO2FBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUNwREQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFFN0MsMkJBQW1CLEdBQVM7SUFDckMsRUFBRSxFQUFFLHFCQUFxQjtJQUN6QixPQUFPLEVBQUUsWUFBWTtJQUNyQixRQUFRLEVBQUU7UUFDTix1QkFBdUIsRUFBRTtZQUNyQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLDBCQUEwQjtZQUNwQyxRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLE9BQU8sRUFBRSwwQkFBMEI7U0FDdEM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSw0Q0FBNEM7WUFDdEQsT0FBTyxFQUFFLDZEQUE2RDtTQUN6RTtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM5QixjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUM7UUFDcEUsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztTQUM3QjthQUFNO1lBQ0gsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUN2REQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUErRjtBQUMvRiwrRUFBMEQ7QUFDMUQsZ0dBQWdEO0FBQ2hELHVGQUEwQztBQUU3QixzQ0FBOEIsR0FBUztJQUNoRCxFQUFFLEVBQUUsZ0NBQWdDO0lBQ3BDLE9BQU8sRUFBRSw0QkFBNEI7SUFDckMsUUFBUSxFQUFFO1FBQ04sNkJBQTZCLEVBQUU7WUFDM0IsVUFBVSxFQUFFLFVBQVU7U0FBQztLQUM5QjtJQUNELElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLFVBQVUsRUFBRSxxQ0FBcUM7WUFDakQsT0FBTyxFQUFFLHFDQUFxQztTQUNqRDtLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsVUFBVSxFQUFFLHdFQUF3RTtZQUNwRixPQUFPLEVBQUUsdUZBQXVGO1NBQ25HO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsZUFBZTtRQUNmLElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RCxJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksR0FBRyxHQUFHLHVCQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUQsSUFBSSxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLHNCQUFVLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFFL0MsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUN2REQ7Ozs7Ozs7Ozs7OytFQVcrRTs7O0FBRS9FLGdHQUFnRDtBQUNoRCwrRUFBNEc7QUFDNUcsK0VBQTBEO0FBQzFELHVGQUEwQztBQUU3QixvQ0FBNEIsR0FBUztJQUM5QyxFQUFFLEVBQUUsOEJBQThCO0lBQ2xDLE9BQU8sRUFBRSxrQkFBa0I7SUFDM0IsWUFBWSxFQUFFLEVBQUU7SUFDaEIsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLG1DQUFtQztZQUM1QywyREFBMkQ7WUFDM0Qsa0JBQWtCLEVBQUUsbUNBQW1DO1lBQ3ZELHVCQUF1QixFQUFFLG1DQUFtQztTQUMvRDtLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLGdFQUFnRTtZQUN6RSw0RkFBNEY7WUFDNUYsa0JBQWtCLEVBQUUsc0NBQXNDO1lBQzFELHVCQUF1QixFQUFFLDJFQUEyRTtTQUN2RztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxFQUFFLEVBQUUsQ0FBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLENBQUM7WUFDaEUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2QsS0FBSyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM1QixZQUFZLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzFDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBbUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUUxRCx5QkFBeUI7UUFDekIsSUFBSSx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUk7ZUFDNUUsUUFBUSxLQUFLLE1BQU0sSUFBSSxRQUFRLEtBQUssTUFBTTtZQUM3QyxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssTUFBTTtZQUNoRCxPQUFPLHlCQUFhLEVBQUMsdUJBQXVCLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3pELElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxPQUFPO1lBQ3RELE9BQU8sb0JBQVEsRUFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7O1lBRWhELE9BQU8sSUFBSSxDQUFDO0lBQ3BCLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDaEVEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBNEc7QUFDNUcsK0VBQTBEO0FBQzFELDBGQUE0QztBQUM1QyxnR0FBZ0Q7QUFDaEQsdUZBQTBDO0FBQzFDLHFIQUFnRTtBQUVoRSxtR0FBa0Q7QUFFckMsa0NBQTBCLEdBQVM7SUFDNUMsRUFBRSxFQUFFLDRCQUE0QjtJQUNoQyxPQUFPLEVBQUUsa0JBQWtCO0lBQzNCLFFBQVEsRUFBRTtRQUNOLDBCQUEwQixFQUFFO1lBQ3hCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGFBQWEsRUFBRSxhQUFhO1NBQUM7S0FDcEM7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsaUNBQWlDO1lBQzNDLGFBQWEsRUFBRSxpQ0FBaUM7WUFDaEQsT0FBTyxFQUFFLGlDQUFpQztTQUM3QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsYUFBYSxFQUFFLHNGQUFzRjtZQUNyRyxPQUFPLEVBQUUsaUZBQWlGO1NBQzdGO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFtQixDQUFDO1FBQ3ZELHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksdUJBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQzdFLE9BQU87UUFFWCw4REFBOEQ7UUFDOUQsSUFBSSx1QkFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDbEMsT0FBTztRQUVYLElBQUksS0FBSyxHQUFHLG1CQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRXpDLElBQUksUUFBUSxHQUFHLGlDQUFlLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVE7WUFDL0IsT0FBTztRQUVYLGlHQUFpRztRQUNqRyxJQUFJLFFBQVEsQ0FBQyxZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUN2RixPQUFPO1FBRVgsOElBQThJO1FBQzlJLElBQUksV0FBVyxDQUFDLGFBQWEsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxVQUFVO1lBQzVGLE9BQU87UUFFWCxrQ0FBa0M7UUFDbEMsSUFBTSxJQUFJLEdBQUcseUJBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDcEQsNERBQTREO1lBQ3hELE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixPQUFPLHlCQUFhLEVBQUMsYUFBYSxDQUFDLENBQUM7SUFFeEMsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUNyRkQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUF1RztBQUN2RywrRUFBMEQ7QUFDMUQsNkZBQThDO0FBRWpDLGdDQUF3QixHQUFTO0lBQzFDLEVBQUUsRUFBRSwwQkFBMEI7SUFDOUIsT0FBTyxFQUFFLGtCQUFrQjtJQUMzQixRQUFRLEVBQUU7UUFDTiw2QkFBNkIsRUFBRTtZQUMzQixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUFDO0tBQzFCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLCtCQUErQjtZQUN6QyxRQUFRLEVBQUUsK0JBQStCO1lBQ3pDLE9BQU8sRUFBRSwrQkFBK0I7U0FDM0M7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSwwREFBMEQ7WUFDcEUsT0FBTyxFQUFFLDBFQUEwRTtTQUN0RjtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsQ0FBQztZQUNyRCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDZixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxHQUFHLEdBQUcscUJBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSwwQkFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV4RixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7UUFDM0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdCO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzVERDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUUxRCxJQUFNLG1CQUFtQixHQUFHO0lBQ3hCLGVBQWU7SUFDZixRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTO0lBQ25FLFdBQVcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsS0FBSztJQUNoRCxtRUFBbUU7SUFDbkUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJO0NBRXpGO0FBRUQsSUFBTSxpQ0FBaUMsR0FBRztJQUN0QyxlQUFlO0lBQ2YsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU87SUFDN0UsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVE7SUFDOUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRO0NBQzFEO0FBRUQsSUFBTSw2QkFBNkIsR0FBRztJQUNsQyxlQUFlO0lBQ2YsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUM7SUFDdkgsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUM7SUFDdkgsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDL0IsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztJQUN6QixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFFaEIsbUVBQW1FO0lBQ25FLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQztJQUN0QixHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDO0lBQ3BELE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO0lBQ3BDLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ2xFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUNsQixNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDbkIsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDO0lBQzFGLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNsSCxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO0lBQzlCLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQztJQUN0QixNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztJQUNuRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFDZixTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFDcEIsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztJQUN0RCxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFDaEIsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ2pCLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFDcEQsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ2YsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ2YsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ2YsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ2YsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ2YsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztJQUM1QixRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFDbkIsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDO0lBQ25CLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2pDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUNkLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUN0RixPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUM7SUFDL0MsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDO0lBQy9DLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztJQUMvQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO0NBQzFEO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSTtJQUNoQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixLQUFtQixVQUFHLEVBQUgsV0FBRyxFQUFILGlCQUFHLEVBQUgsSUFBRyxFQUFFO1FBQW5CLElBQU0sSUFBSTtRQUNYLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUUsR0FBRyxJQUFJLElBQUksQ0FBQztRQUNuRCxJQUFJLElBQUksS0FBSyxlQUFlO1lBQ3hCLEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ3BCLElBQUksSUFBSSxLQUFLLGlCQUFpQjtZQUMvQixHQUFHLElBQUksUUFBUSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7S0FDcEM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBWTtJQUN0QyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixLQUFLLElBQU0sSUFBSSxJQUFJLEdBQUcsRUFBRTtRQUNwQixJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUFFLEdBQUcsSUFBSSxJQUFJLENBQUM7UUFDbkQsSUFBSSxJQUFJLEtBQUsseUJBQXlCLEVBQUU7WUFDcEMsS0FBbUIsVUFBcUIsRUFBckIsUUFBRyxDQUFDLElBQUksQ0FBYSxFQUFyQixjQUFxQixFQUFyQixJQUFxQixFQUFFO2dCQUFyQyxJQUFNLElBQUk7Z0JBQ1gsSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQUUsR0FBRyxJQUFJLElBQUksQ0FBQztnQkFDbkQsR0FBRyxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7YUFDM0M7U0FDSjtLQUNKO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBRVksb0NBQTRCLEdBQVM7SUFDOUMsRUFBRSxFQUFFLDhCQUE4QjtJQUNsQyxPQUFPLEVBQUUsb3JGQUFvckY7SUFDN3JGLElBQUksRUFBRTtRQUNGLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSxtQ0FBbUM7WUFDM0MsV0FBVyxFQUFFLG1DQUFtQztZQUNoRCxXQUFXLEVBQUUsbUNBQW1DO1lBQ2hELGdCQUFnQixFQUFFLG1DQUFtQztZQUNyRCxPQUFPLEVBQUUsbUNBQW1DO1NBQy9DO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsYUFBYTtZQUNyQixXQUFXLEVBQUUsMkNBQTJDO1lBQ3hELFdBQVcsRUFBRSx1REFBdUQ7WUFDcEUsZ0JBQWdCLEVBQUUsNkVBQTZFO1lBQy9GLE9BQU8sRUFBRSw0Q0FBNEM7U0FDeEQ7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLENBQUM7WUFDckQsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2YsT0FBTyxFQUFFLG1CQUFXLENBQUMsY0FBYztZQUNuQyxjQUFjLEVBQUUscUJBQWEsQ0FBQyxXQUFXO1NBQzVDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBRW5ELHdFQUF3RTtRQUN4RSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDckYsT0FBTyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQyx3RUFBd0U7WUFDeEUsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELElBQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFcEQsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IscUNBQXFDO1FBQ3JDLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sb0JBQVEsRUFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBRTVDO1FBRUQsbURBQW1EO1FBQ25ELElBQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzlDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixLQUFtQixVQUFLLEVBQUwsZUFBSyxFQUFMLG1CQUFLLEVBQUwsSUFBSyxFQUFFO1lBQXJCLElBQU0sSUFBSTtZQUNYLElBQUksaUNBQWlDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLFVBQVUsS0FBSyxFQUFFO29CQUFFLFVBQVUsSUFBSSxJQUFJLENBQUM7Z0JBQzFDLFVBQVUsSUFBSSxJQUFJLENBQUM7YUFDdEI7U0FDSjtRQUNELElBQUksVUFBVSxLQUFLLEVBQUUsRUFBRTtZQUNuQixPQUFPLG9CQUFRLEVBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUM5QztRQUVELHNEQUFzRDtRQUN0RCxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksUUFBUSxJQUFJLDZCQUE2QixFQUFFO1lBQzNDLEtBQW1CLFVBQUssRUFBTCxlQUFLLEVBQUwsbUJBQUssRUFBTCxJQUFLLEVBQUU7Z0JBQXJCLElBQU0sSUFBSTtnQkFDWCxJQUFJLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxJQUFJLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbkcsSUFBSSxVQUFVLEtBQUssRUFBRTt3QkFBRSxVQUFVLElBQUksSUFBSSxDQUFDO29CQUMxQyxVQUFVLElBQUksSUFBSSxDQUFDO2lCQUN0QjthQUNKO1lBQ0QsSUFBSSxVQUFVLEtBQUssRUFBRSxFQUFFO2dCQUNuQixPQUFPLG9CQUFRLEVBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUM3RDtTQUNKO1FBRUQsT0FBTyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDcExEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELDRJQUE0RTtBQUUvRCx5QkFBaUIsR0FBUztJQUNuQyxFQUFFLEVBQUUsbUJBQW1CO0lBQ3ZCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFFBQVEsRUFBRTtRQUNOLG1CQUFtQixFQUFFO1lBQ2pCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQ3JCO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLFFBQVEsRUFBRSx3QkFBd0I7WUFDbEMsUUFBUSxFQUFFLHdCQUF3QjtZQUNsQyxRQUFRLEVBQUUsd0JBQXdCO1NBQ3JDO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsZ0VBQWdFO1lBQ3pFLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFFBQVEsRUFBRSxvREFBb0Q7WUFDOUQsUUFBUSxFQUFFLDZEQUE2RDtTQUMxRTtLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsQ0FBQztZQUNyRCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDZixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxDQUFDO1lBQ0YsUUFBUSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsUUFBUSxFQUFFLE1BQU07YUFDbkI7U0FDSixDQUFDO0lBQ0YsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFFbkQsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4QywyRkFBMkY7UUFDM0Ysa0JBQWtCO1FBQ2xCLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNYLHNHQUFzRztZQUN0RyxPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsSUFBSSxPQUFPLEdBQUcsdUJBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELElBQUksTUFBTSxHQUFHLE9BQU8sS0FBSyxXQUFXLENBQUM7UUFDckMsNkhBQTZIO1FBQzdILElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3ZFO2FBQU07WUFDSCxPQUFPLG9CQUFRLEVBQUMsUUFBUSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzdFRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXdIO0FBQ3hILCtFQUEwRDtBQUMxRCxnSUFBb0U7QUFDcEUsdUZBQTBDO0FBQzFDLGlHQUFtRDtBQUVuRCxtR0FBa0Q7QUFFbEQsSUFBTSxZQUFZLEdBQUcsVUFBQyxPQUFvQjtJQUN0QyxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO0lBQ25ELElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEQsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ2xDLElBQUksUUFBUSxLQUFLLE1BQU0sSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoRSw2Q0FBNkM7U0FDaEQ7YUFBTTtZQUNILElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGVBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDckMsT0FBTyxDQUFDLENBQUM7YUFDWjtZQUNELElBQUksQ0FBQyxlQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM1QixPQUFPLENBQUMsQ0FBQzthQUNaO1NBQ0o7S0FDSjtJQUNELElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUN0QyxJQUFJLFFBQVEsS0FBSyxNQUFNLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEUsNkNBQTZDO1NBQ2hEO2FBQU07WUFDSCxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxlQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3JDLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7WUFDRCxJQUFJLENBQUMsZUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDNUIsT0FBTyxDQUFDLENBQUM7YUFDWjtTQUNKO0tBQ0o7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFWSx1QkFBZSxHQUFTO0lBQ2pDLEVBQUUsRUFBRSxpQkFBaUI7SUFDckIsT0FBTyxFQUFFLG9DQUFvQztJQUM3QyxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsc0JBQXNCO1lBQ2hDLFFBQVEsRUFBRSxzQkFBc0I7WUFDaEMsUUFBUSxFQUFFLHNCQUFzQjtZQUNoQyxRQUFRLEVBQUUsc0JBQXNCO1lBQ2hDLFFBQVEsRUFBRSxzQkFBc0I7WUFDaEMsT0FBTyxFQUFFLHNCQUFzQjtTQUNsQztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLHNEQUFzRDtZQUNoRSxRQUFRLEVBQUUsc0VBQXNFO1lBQ2hGLFFBQVEsRUFBRSx1REFBdUQ7WUFDakUsUUFBUSxFQUFFLDBFQUEwRTtZQUNwRixRQUFRLEVBQUUsMkRBQTJEO1lBQ3JFLE9BQU8sRUFBRSw4RkFBOEY7U0FDMUc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLENBQUM7WUFDRixRQUFRLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixRQUFRLEVBQUUsY0FBYztnQkFDeEIsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLFFBQVEsRUFBRSxjQUFjO2FBQzNCO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixRQUFRLEVBQUUsY0FBYzthQUMzQjtZQUNELGlGQUFpRjtZQUNqRixjQUFjO1lBQ2Qsd0JBQXdCO1lBQ3hCLHdCQUF3QjtZQUN4Qix3QkFBd0I7WUFDeEIsZ0NBQWdDO1lBQ2hDLCtCQUErQjtZQUMvQixJQUFJO1NBQ1AsQ0FBQztJQUNGLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsd0ZBQXdGO1FBQ3hGLElBQUksTUFBTSxHQUFHO1lBQ1Qsb0JBQVEsRUFBQyxRQUFRLENBQUM7WUFDbEIsb0JBQVEsRUFBQyxRQUFRLENBQUM7WUFDbEIsb0JBQVEsRUFBQyxRQUFRLENBQUM7WUFDbEIsb0JBQVEsRUFBQyxRQUFRLENBQUM7WUFDbEIsb0JBQVEsRUFBQyxRQUFRLENBQUM7U0FDckI7UUFDRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUFFWSwwQkFBa0IsR0FBUztJQUNwQyxFQUFFLEVBQUUsb0JBQW9CO0lBQ3hCLE9BQU8sRUFBRSw4QkFBOEI7SUFDdkMsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLHlCQUF5QjtZQUNuQyxRQUFRLEVBQUUseUJBQXlCO1lBQ25DLFFBQVEsRUFBRSx5QkFBeUI7WUFDbkMsUUFBUSxFQUFFLHlCQUF5QjtZQUNuQyxRQUFRLEVBQUUseUJBQXlCO1lBQ25DLE9BQU8sRUFBRSx5QkFBeUI7U0FDckM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxzREFBc0Q7WUFDaEUsUUFBUSxFQUFFLHNFQUFzRTtZQUNoRixRQUFRLEVBQUUsdURBQXVEO1lBQ2pFLFFBQVEsRUFBRSwwRUFBMEU7WUFDcEYsUUFBUSxFQUFFLDJEQUEyRDtZQUNyRSxPQUFPLEVBQUUsa0dBQWtHO1NBQzlHO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDNUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxDQUFDO1lBQ0YsY0FBYztZQUNkLHdCQUF3QjtZQUN4Qix3QkFBd0I7WUFDeEIsZ0NBQWdDO1lBQ2hDLGdDQUFnQztZQUNoQywrQkFBK0I7WUFDL0IsS0FBSztZQUNMLGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIsd0JBQXdCO1lBQ3hCLHdCQUF3QjtZQUN4Qix3QkFBd0I7WUFDeEIsK0JBQStCO1lBQy9CLEtBQUs7WUFDTCxpRkFBaUY7WUFDakYsUUFBUSxFQUFFO2dCQUNOLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixRQUFRLEVBQUUsY0FBYzthQUMzQjtTQUNKLENBQUM7SUFDRixHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsMkRBQTJEO1FBQzNELElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLFFBQVEsS0FBSyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDckMsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLHdGQUF3RjtRQUN4RixJQUFJLE1BQU0sR0FBRztZQUNULG9CQUFRLEVBQUMsUUFBUSxDQUFDO1lBQ2xCLG9CQUFRLEVBQUMsUUFBUSxDQUFDO1lBQ2xCLG9CQUFRLEVBQUMsUUFBUSxDQUFDO1lBQ2xCLG9CQUFRLEVBQUMsUUFBUSxDQUFDO1lBQ2xCLG9CQUFRLEVBQUMsUUFBUSxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyx1QkFBZSxDQUFDLElBQUksRUFBRTtZQUMxQyx1R0FBdUc7WUFDdkcsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxHQUFHLElBQUkscUJBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDOUQsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQ2pDLGNBQWM7b0JBQ2QsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7d0JBQ3hCLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFlLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUNqRSxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzt5QkFDckI7NkJBQU07NEJBQ0gsSUFBTSxJQUFJLEdBQUcseUJBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDeEQsVUFBVSxHQUFHLFVBQVU7bUNBQ2hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLHVEQUFzRCxDQUFDO3lCQUMvSjtxQkFDSjt5QkFBTTt3QkFDSCxVQUFVLEdBQUcsVUFBVTsrQkFDaEIsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7cUJBQ3hFO2lCQUNKO2FBQ0o7WUFDRCxJQUFJLENBQUMsVUFBVTtnQkFBRSxPQUFPLElBQUksQ0FBQztTQUNoQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdE5EOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBeUc7QUFDekcsK0VBQTBEO0FBRTdDLG1DQUEyQixHQUFTO0lBQzdDLEVBQUUsRUFBRSw2QkFBNkI7SUFDakMsT0FBTyxFQUFFLG9JQUFvSTtJQUM3SSxRQUFRLEVBQUU7UUFDTiwyQkFBMkIsRUFBRTtZQUN6QixRQUFRLEVBQUUsUUFBUTtZQUNsQixVQUFVLEVBQUUsVUFBVTtTQUFDO0tBQzlCO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGtDQUFrQztZQUM1QyxVQUFVLEVBQUUsa0NBQWtDO1lBQzlDLE9BQU8sRUFBRSxrQ0FBa0M7U0FDOUM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLFFBQVEsRUFBRSxhQUFhO1lBQ3ZCLFVBQVUsRUFBRSxxR0FBcUc7WUFDakgsT0FBTyxFQUFFLHdGQUF3RjtTQUNwRztLQUNKO0lBQ0QsUUFBUSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUN6RixLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxFQUFFLG1CQUFXLENBQUMsY0FBYztZQUNuQyxjQUFjLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQzFDLENBQUM7SUFDRixHQUFHLEVBQUUsRUFBRTtJQUNQLEdBQUcsRUFBRSxVQUFDLE9BQW9CLEVBQUUsT0FBWSxFQUFFLGtCQUF5QztRQUMvRSxJQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBZSxDQUFDO1FBQ25ELElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDekMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO2dCQUNwQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO2dCQUN4QyxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRixDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMvRSxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNqRixDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRSxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztvQkFDM0UsUUFBUSxJQUFJLEdBQUcsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV0RCxJQUFJLGlCQUFpQixHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULDBEQUEwRDtZQUMxRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3hDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN4QztZQUNELElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDbkYsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDL0UsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDakYsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDL0UsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3hDO1lBQ0QsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDaEYsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLEdBQUcsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDO29CQUMxQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDekM7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxvQkFBUSxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBVSxFQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFHLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7O0FDdEZEOzs7Ozs7Ozs7Ozs4RUFXOEU7OztBQUU5RSwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELHVGQUEwQztBQUMxQyx1RkFBMEM7QUFDMUMsNkZBQThDO0FBQzlDLDRJQUE0RTtBQUM1RSxnR0FBZ0Q7QUFFbkMsb0NBQTRCLEdBQVM7SUFDOUMsRUFBRSxFQUFFLDhCQUE4QjtJQUNsQyxPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxNQUFNLEVBQUUsbUNBQW1DO1lBQzNDLGFBQWEsRUFBRSxtQ0FBbUM7WUFDbEQsT0FBTyxFQUFFLG1DQUFtQztTQUMvQztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLHdHQUF3RztZQUNoSCxhQUFhLEVBQUUsMEdBQTBHO1lBQ3pILE9BQU8sRUFBRSw0R0FBNEc7U0FDeEg7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDekYsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUMxQyxDQUFDO0lBQ0YsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO0lBQ2YsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFtQixDQUFDO1FBRXZELHdCQUF3QjtRQUN4QixJQUFJLENBQUMsaUJBQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1FBRWhCLGVBQWU7UUFDZixJQUFJLHVCQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEUsT0FBTyxJQUFJLENBQUM7UUFFaEIsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwRCxnRUFBZ0U7UUFDaEUsSUFBSSxHQUFHLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQVEsQ0FBQztRQUM1RCxJQUFJLHFCQUFxQixHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxxQ0FBcUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDeEIscUJBQXFCLEdBQUcsaUJBQU8sQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRSxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUscUNBQXFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztTQUN6RjtRQUVELHNEQUFzRDtRQUN0RCxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDLGFBQUc7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFHO2dCQUMvQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGlCQUFPLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUMxRyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVM7d0JBQ3pDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQzs7d0JBRWpFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUM5RDtZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFFSCw4REFBOEQ7UUFDOUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRS9DLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztnQ0FDSixDQUFDO1lBQ04sSUFBSSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxPQUFPLGVBQWUsS0FBSyxRQUFRO2dCQUNuQyxLQUFJLElBQUksR0FBRyxJQUFJLGVBQWU7b0JBQzFCLGVBQWUsR0FBRyxHQUFHLEdBQUUsR0FBRyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRSxHQUFHLENBQUM7WUFFL0QsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDN0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFRO2dCQUNwRSxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO29CQUFFLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQztZQUNILDhCQUE4QjtZQUM5QixJQUFJLENBQUMsZ0JBQWdCO2tDQUFXO1lBRWhDLElBQUksTUFBTSxHQUFHLGlCQUFPLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFeEQsOEJBQThCO1lBQzlCLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7YUFFOUI7WUFDRDs7O2NBR0U7WUFDRixJQUFNLFlBQVksR0FBRyxpQkFBTyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTNEOztlQUVHO1lBQ0gsSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQzNCLElBQU0sV0FBVyxHQUFHLGlCQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLHFCQUFxQjtnQkFDckIsTUFBTSxJQUFJLFdBQVcsQ0FBQzthQUN6QjtZQUVELCtFQUErRTtZQUMvRSxvREFBb0Q7WUFDcEQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBUSxFQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBQzdDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOztRQXZDcEMsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7b0JBQXJDLENBQUM7U0F3Q1Q7UUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNkLE9BQU8sR0FBRyxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUNoSUQ7Ozs7Ozs7Ozs7OytFQVcrRTs7O0FBRy9FLGdHQUFnRDtBQUNoRCwrRUFBdUc7QUFDdkcsK0VBQTBEO0FBQzFELHVGQUEwQztBQUMxQyx3RkFBMkM7QUFFOUIsbUNBQTJCLEdBQVM7SUFDN0MsRUFBRSxFQUFFLDZCQUE2QjtJQUNqQyxPQUFPLEVBQUUsT0FBTztJQUNoQixZQUFZLEVBQUUsRUFBRTtJQUNoQixJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsa0NBQWtDO1lBQzNDLGVBQWUsRUFBRSxrQ0FBa0M7WUFDbkQsa0JBQWtCLEVBQUUsa0NBQWtDO1lBQ3RELGlCQUFpQixFQUFFLGtDQUFrQztTQUN4RDtLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsT0FBTyxFQUFFLG9FQUFvRTtZQUM3RSxlQUFlLEVBQUUsb0NBQW9DO1lBQ3JELGtCQUFrQixFQUFFLDZDQUE2QztZQUNqRSxpQkFBaUIsRUFBRSwyRUFBMkU7U0FDakc7S0FDSjtJQUNELFFBQVEsRUFBRSxDQUFDO1lBQ1AsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsd0JBQXdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDdkYsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ2QsS0FBSyxFQUFFLG1CQUFXLENBQUMsU0FBUztZQUM1QixZQUFZLEVBQUUscUJBQWEsQ0FBQyxTQUFTO1NBQ3hDLENBQUM7SUFDRixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7SUFDZixHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQW1CLENBQUM7UUFDdkQscURBQXFEO1FBQ3JELElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDN0UsT0FBTztRQUVYLGVBQWU7UUFDZixJQUFJLHVCQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sSUFBSSxDQUFDO1FBRWhCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsdUJBQVUsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEQsSUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQztlQUM5RCxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDO1lBQ3BFLE9BQU8sSUFBSSxDQUFDO1FBRWhCLGtKQUFrSjtRQUNsSixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRTtZQUNySSxPQUFPLElBQUksQ0FBQztRQUVmLGtGQUFrRjtRQUNsRixJQUFNLFNBQVMsR0FBRyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUcsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdJLElBQU0sU0FBUyxHQUFHLGlCQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRyxpQkFBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDN0ksSUFBSSxXQUFXLENBQUMsV0FBVyxHQUFJLFdBQVcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFNBQVM7ZUFDL0QsV0FBVyxDQUFDLFlBQVksR0FBSSxXQUFXLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRSxTQUFTO1lBQ3RFLE9BQU8sSUFBSSxDQUFDO1FBRWhCLDhCQUE4QjtRQUM5QixJQUFJLHVCQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUNsQyxPQUFPLG9CQUFRLEVBQUMsZUFBZSxDQUFDLENBQUM7UUFFckMsdUNBQXVDO1FBQ3ZDLElBQU0sS0FBSyxHQUFHLHVCQUFVLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBSSxLQUFLLEdBQUcsQ0FBQztZQUNULE9BQU8sb0JBQVEsRUFBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXhDLG9GQUFvRjtRQUNwRixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEYsT0FBTyxJQUFJLENBQUM7UUFFaEIsT0FBTyxvQkFBUSxFQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQzlGRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQXVHO0FBQ3ZHLCtFQUEwRDtBQUMxRCwwRkFBNEM7QUFDNUMsZ0dBQWdEO0FBQ2hELHFIQUFnRTtBQUNoRSx1RkFBMEM7QUFDMUMsaUdBQW1EO0FBQ25ELHVGQUEwQztBQUU3QixtQ0FBMkIsR0FBUztJQUM3QyxFQUFFLEVBQUUsNkJBQTZCO0lBQ2pDLE9BQU8sRUFBQyxPQUFPO0lBQ2YsSUFBSSxFQUFFO1FBQ0YsT0FBTyxFQUFFO1lBQ0wsTUFBTSxFQUFFLGtDQUFrQztZQUMxQyxtQkFBbUIsRUFBRSxrQ0FBa0M7WUFDdkQsb0JBQW9CLEVBQUUsa0NBQWtDO1lBQ3hELE9BQU8sRUFBRSxrQ0FBa0M7U0FDOUM7S0FDSjtJQUNELFFBQVEsRUFBRTtRQUNOLE9BQU8sRUFBRTtZQUNMLE1BQU0sRUFBRSx3Q0FBd0M7WUFDaEQsbUJBQW1CLEVBQUUsd0RBQXdEO1lBQzdFLG9CQUFvQixFQUFFLHdEQUF3RDtZQUM5RSxPQUFPLEVBQUUsa0RBQWtEO1NBQzlEO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNILElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixDQUFDO1lBQ3JELEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzlCLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUM7UUFDRDtZQUNJLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQzFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFNBQVM7U0FDMUMsQ0FBQztJQUNOLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFtQixDQUFDO1FBRXZELElBQUksdUJBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVuRyxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BELG9JQUFvSTtRQUNwSSxJQUFJLFFBQVEsSUFBSSx1QkFBVSxDQUFDLFNBQVMsRUFBRztZQUNuQyxJQUFJLEtBQUssR0FBRyx1QkFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxVQUFVLEVBQUU7Z0JBQy9CLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDOUI7WUFDRCxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxJQUFJLENBQUM7U0FDMUI7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzNGLE9BQU8sSUFBSSxDQUFDO1FBRWhCLG9EQUFvRDtRQUNwRCxJQUFJLE1BQU0sR0FBRyxpQkFBTyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssUUFBUTtlQUNuRSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxNQUFNO1lBQ3JFLE9BQU8sSUFBSSxDQUFDO1FBRWhCLDBGQUEwRjtRQUMxRixnRkFBZ0Y7UUFDaEYsSUFBTSwwQkFBMEIsR0FBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsZUFBZTtZQUNoRyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUzRCxJQUFNLE1BQU0sR0FBRyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVqRCxJQUFNLFdBQVcsR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFpQixDQUFDLENBQUM7UUFFaEUsNkRBQTZEO1FBQzdELElBQUksMEJBQTBCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUMzQyxPQUFPLElBQUksQ0FBQztRQUVyQixJQUFJLElBQUksR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSTtZQUNMLE9BQU8sb0JBQVEsRUFBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzFDLHdOQUF3TjtRQUN4TixJQUFJLElBQUksS0FBSyxhQUFhO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBRWhCLG1GQUFtRjtRQUNuRiw0Q0FBNEM7UUFDNUMsdURBQXVEO1FBQ3ZELG1DQUFtQztRQUNuQyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLFdBQVcsSUFBSSxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ2xHLE9BQU8sb0JBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELE9BQU8sb0JBQVEsRUFBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUM3R0Q7Ozs7Ozs7Ozs7OytFQVcrRTs7O0FBRS9FLGdHQUFnRDtBQUNoRCwrRUFBNEc7QUFDNUcsK0VBQTBEO0FBQzFELHVGQUEwQztBQUMxQyxpR0FBbUQ7QUFFdEMsbUNBQTJCLEdBQVM7SUFDN0MsRUFBRSxFQUFFLDZCQUE2QjtJQUNqQyxPQUFPLEVBQUUsT0FBTztJQUNoQixZQUFZLEVBQUUsRUFBRTtJQUNoQixJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsa0NBQWtDO1lBQzNDLE1BQU0sRUFBRSxrQ0FBa0M7WUFDMUMsb0JBQW9CLEVBQUUsa0NBQWtDO1NBQzNEO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsNkVBQTZFO1lBQ3RGLE1BQU0sRUFBRSxzREFBc0Q7WUFDOUQsb0JBQW9CLEVBQUUsc0lBQXNJO1NBQy9KO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLEVBQUUsRUFBRSxDQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsQ0FBQztZQUNoRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDZixLQUFLLEVBQUUsbUJBQVcsQ0FBQyxTQUFTO1lBQzVCLFlBQVksRUFBRSxxQkFBYSxDQUFDLFdBQVc7U0FDMUMsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFtQixDQUFDO1FBRXZELElBQUksQ0FBQyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUMxRSxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFMUQseUJBQXlCO1FBQ3pCLElBQUksdUJBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJO2VBQzVFLFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxLQUFLLE1BQU07WUFDN0MsT0FBTyxJQUFJLENBQUM7UUFFaEIsSUFBTSxNQUFNLEdBQWUsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDM0MsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQUEsQ0FBQztRQUV4RCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUV6QixxQkFBcUI7UUFDckIsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDO1FBRWhCLElBQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7UUFDdEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNOLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBRTVCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDTixPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpELElBQUksTUFBTSxLQUFLLElBQUk7WUFDZixPQUFPLElBQUksQ0FBQztRQUVoQixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU07WUFDNUIsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUVqQixJQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQztZQUMzQixPQUFPO1FBRVgsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLGNBQUk7WUFDZDs7O2VBR0c7WUFDSCxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzVCLHNFQUFzRTtnQkFDdEUsTUFBTSxHQUFHLEtBQUssQ0FBQzthQUNsQjtpQkFBTSxJQUFJLGlCQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDbkUsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxJQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQztnQkFDbEIsSUFBSSxNQUFNLEVBQUU7b0JBQ1IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDbEMsT0FBTyxHQUFHLEdBQUcsQ0FBQztpQkFDckI7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUM7dUJBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU07dUJBQzFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLO3VCQUNyRCxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFDN0Y7b0JBQ0ksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDekI7YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QixPQUFPLHlCQUFhLEVBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDbEQ7UUFFRCxPQUFPLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUM5SEQ7Ozs7Ozs7Ozs7OytFQVcrRTs7O0FBRS9FLGdHQUFnRDtBQUNoRCx1RkFBMEM7QUFDMUMsK0VBQTRHO0FBQzVHLCtFQUEwRDtBQUMxRCxpR0FBbUQ7QUFFdEMsZ0NBQXdCLEdBQVM7SUFDMUMsRUFBRSxFQUFFLDBCQUEwQjtJQUM5QixPQUFPLEVBQUUsT0FBTztJQUNoQixZQUFZLEVBQUUsRUFBRTtJQUNoQixJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsK0JBQStCO1lBQ3hDLE1BQU0sRUFBRSwrQkFBK0I7WUFDdkMsbUJBQW1CLEVBQUUsK0JBQStCO1NBQ3ZEO0tBQ0o7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUU7WUFDTCxPQUFPLEVBQUUsK0VBQStFO1lBQ3hGLE1BQU0sRUFBRSwrQ0FBK0M7WUFDdkQsbUJBQW1CLEVBQUUsaUdBQWlHO1NBQ3pIO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3ZGLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNkLEtBQUssRUFBRSxtQkFBVyxDQUFDLFNBQVM7WUFDNUIsWUFBWSxFQUFFLHFCQUFhLENBQUMsU0FBUztTQUN4QyxDQUFDO0lBQ0YsR0FBRyxFQUFFLEVBQUU7SUFDUCxHQUFHLEVBQUUsVUFBQyxPQUFvQixFQUFFLE9BQVksRUFBRSxrQkFBeUM7UUFDL0UsSUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQW1CLENBQUM7UUFDdkQsSUFBSSxDQUFDLHVCQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQztRQUVoQixJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDMUQsSUFBTSxNQUFNLEdBQWUsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDM0MsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXZELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpCLG1EQUFtRDtRQUNuRCxJQUFNLGNBQWMsR0FBRyxpQkFBTyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdELElBQU0sY0FBYyxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXZFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUMvQyxPQUFPLHlCQUFhLEVBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbEQsSUFBSSxjQUFjLENBQUMsVUFBVSxDQUFDLEtBQUcsVUFBVSxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBRyx1QkFBdUI7ZUFDdEksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDNUI7Ozs7O2VBS0c7WUFDSCxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFHLFVBQVUsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFHLE9BQU8sQ0FBQyxFQUFFO2dCQUN2SCxJQUFNLEtBQUssR0FBRyx1QkFBVSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLEtBQUssSUFBSSxDQUFDLHVCQUFVLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzlDLElBQU0sWUFBWSxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNyRSxJQUFNLG9CQUFvQixHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ3JGLElBQU0sbUJBQW1CLEdBQUcsaUJBQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQ25GLElBQU0sY0FBYyxHQUFHLGlCQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUV6RSxJQUFJLFlBQVksSUFBSSxvQkFBb0IsSUFBSSxtQkFBbUIsSUFBSSxjQUFjO3dCQUM3RSxPQUFPLG9CQUFRLEVBQUMsTUFBTSxDQUFDLENBQUM7aUJBQy9CO2FBQ0o7WUFDRCxPQUFPLHlCQUFhLEVBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDakQ7UUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDekMsT0FBTyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVCLElBQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXJELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFMUIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUc7WUFDM0MsNERBQTREO1lBQzVELE9BQU8seUJBQWEsRUFBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0gsK0JBQStCO1lBQy9CLElBQUksU0FBUyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLElBQUksT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxFQUFFO2dCQUM5QyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLGNBQWMsQ0FBQyxVQUFVLENBQUMsS0FBSyxXQUFXLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN6SixHQUFHLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2pEO3FCQUFNO29CQUNILG9FQUFvRTtvQkFDcEUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7aUJBQzFCO2FBQ0o7WUFDRCxJQUFJLE9BQU8sY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVcsRUFBRTtnQkFDL0MsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxjQUFjLENBQUMsVUFBVSxDQUFDLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDekosSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNuRDtxQkFBTTtvQkFDSCxvRUFBb0U7b0JBQ3BFLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO2lCQUMzQjthQUNKO1NBQ0o7UUFFRCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7WUFDckIsT0FBTyxvQkFBUSxFQUFDLE1BQU0sQ0FBQyxDQUFDOztZQUV4QixPQUFPLHlCQUFhLEVBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7QUMzSEQ7Ozs7Ozs7Ozs7OzhFQVc4RTs7O0FBRTlFLCtFQUE0RztBQUM1RywrRUFBMEQ7QUFDMUQsZ0dBQWdEO0FBQ2hELHVGQUEwQztBQUU3Qix3QkFBZ0IsR0FBUztJQUNsQyxFQUFFLEVBQUUsa0JBQWtCO0lBQ3RCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFFBQVEsRUFBRTtRQUNOLGtCQUFrQixFQUFFO1lBQ2hCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGFBQWEsRUFBRSxhQUFhO1NBQUM7S0FDcEM7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsdUJBQXVCO1lBQ2pDLGFBQWEsRUFBRSx1QkFBdUI7WUFDdEMsT0FBTyxFQUFFLHVCQUF1QjtTQUNuQztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsYUFBYSxFQUFFLHlEQUF5RDtZQUN4RSxPQUFPLEVBQUUsa0RBQWtEO1NBQzlEO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFVBQVU7U0FDM0MsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsZUFBZTtRQUNmLElBQUksaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6RCxJQUFJLE1BQU0sR0FBRyx1QkFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5RCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBQyxhQUFhLENBQUMsQ0FBQztJQUN0RSxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ3RERDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQTRHO0FBQzVHLCtFQUEwRDtBQUU3Qyw0QkFBb0IsR0FBUztJQUN0QyxFQUFFLEVBQUUsc0JBQXNCO0lBQzFCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFFBQVEsRUFBRTtRQUNOLHlCQUF5QixFQUFFO1lBQ3ZCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGFBQWEsRUFBRSxhQUFhO1NBQUM7S0FDcEM7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsMkJBQTJCO1lBQ3JDLGFBQWEsRUFBRSwyQkFBMkI7WUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtTQUN2QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsYUFBYSxFQUFFLG1GQUFtRjtZQUNsRyxPQUFPLEVBQUUsMkVBQTJFO1NBQ3ZGO0tBQ0o7SUFDRCxRQUFRLEVBQUUsQ0FBQztZQUNQLElBQUksRUFBRSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3pGLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNoQixPQUFPLEVBQUUsbUJBQVcsQ0FBQyxjQUFjO1lBQ25DLGNBQWMsRUFBRSxxQkFBYSxDQUFDLFVBQVU7U0FDM0MsQ0FBQztJQUNGLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFlLENBQUM7UUFDbkQsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULElBQUksUUFBUSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDdkMsT0FBTyxDQUFDLE1BQU0sSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFO2dCQUNqQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksU0FBUztvQkFDNUMsTUFBTSxHQUFHLElBQUksQ0FBQztxQkFDYixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQ3ZGLE1BQU07cUJBQ0wsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUM7b0JBQzNCLE1BQU07Z0JBQ1YsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7YUFDbkM7U0FDSjtRQUNELElBQUksTUFBTTtZQUFFLE9BQU8sb0JBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8seUJBQWEsRUFBQyxhQUFhLENBQUMsQ0FBQztJQUVyRCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7OztBQ2hFRDs7Ozs7Ozs7Ozs7OEVBVzhFOzs7QUFFOUUsK0VBQTRHO0FBQzVHLGdHQUFnRDtBQUVuQyw0QkFBb0IsR0FBUztJQUN0QyxFQUFFLEVBQUUsc0JBQXNCO0lBQzFCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFFBQVEsRUFBRTtRQUNOLHVCQUF1QixFQUFFO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLGFBQWEsRUFBRSxhQUFhO1NBQUM7S0FDcEM7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUUsMkJBQTJCO1lBQ3JDLGFBQWEsRUFBRSwyQkFBMkI7WUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtTQUN2QztLQUNKO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFO1lBQ0wsUUFBUSxFQUFFLGFBQWE7WUFDdkIsYUFBYSxFQUFFLCtDQUErQztZQUM5RCxPQUFPLEVBQUUsMkVBQTJFO1NBQ3ZGO0tBQ0o7SUFDRDs7Ozs7Ozs7O01BU0U7SUFDRixRQUFRLEVBQUUsRUFBRTtJQUNaLEdBQUcsRUFBRSxFQUFFO0lBQ1AsR0FBRyxFQUFFLFVBQUMsT0FBb0IsRUFBRSxPQUFZLEVBQUUsa0JBQXlDO1FBQy9FLElBQU0sY0FBYyxHQUFHO1lBQ25CLFNBQVMsRUFBRTtnQkFDUCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7b0JBQzdFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO29CQUN6RixJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSTtvQkFDdEYsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUs7b0JBQzFGLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUk7b0JBQzdGLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUs7b0JBQy9GLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUs7b0JBQ3pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxF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LEdBQUcsRUFBRSxDQUFDO2dCQUNkLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDZCw4REFBOEQ7Z0JBQzlELElBQUksTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzVKLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBRTlOLG1FQUFtRTtnQkFDbkUsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUks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QUF4REQsOEJBd0RDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQURlZmluaXRpb25zLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFNYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQVdhbGtlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29tbW9uTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29udGV4dC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0VuZ2luZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29uZmlnL0NvbmZpZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTU1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01XYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL3N0eWxlL1N0eWxlTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSUd1aWRlbGluZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvYXBpL0lSdWxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9jaGVja2VyL0NoZWNrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGFyZ2V0X3dhcm5pbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGV4dF9wdXJwb3NlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsZXRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmVhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Rlc2NlbmRhbnRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2dyYXBoaWNfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaGlkZGVuX25vbnRhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9pbWdfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3BhcmVudF9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcm9sZV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZW1hbnRpY3MudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfd2lkZ2V0X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hc2NpaWFydF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19jc3NfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19lbGVtX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NhbnZhc19jb250ZW50X2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FwdGlvbl90cmFja19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2Rlc2lnbl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9oYXNwb3B1cF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZWJ1Z19wYXRocy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGV0ZWN0b3JfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rpcl9hdHRyaWJ1dGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9pZF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfbGFuZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VtYmVkX25vZW1iZWRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbW90aWNvbnNfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZXJyb3JfbWVzc2FnZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZWxkc2V0X2xhYmVsX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWVsZHNldF9sZWdlbmRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZpZ3VyZV9sYWJlbF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fZm9udF9jb2xvci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX3N1Ym1pdF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZyYW1lX3NyY192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZnJhbWVfdGl0bGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9oZWFkaW5nX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9oZWFkaW5nX21hcmt1cF9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2h0bWxfbGFuZ19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2h0bWxfc2tpcG5hdl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1hZ2VidXR0b25fYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1hZ2VtYXBfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9iYWNrZ3JvdW5kLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X2RlY29yYXRpdmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X251bGwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfaXNtYXBfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfbG9uZ2Rlc2NfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbmRleC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9jaGVja2JveGVzX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2ZpZWxkc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9oYXNwb3B1cF9jb25mbGljdC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfYWZ0ZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2JlZm9yZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9vbmNoYW5nZV9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9uYW1lX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xhYmVsX3JlZl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9jaGlsZHJlbl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9tYXJrdXBfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9saXN0X3N0cnVjdHVyZV9wcm9wZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21hcnF1ZWVfZWxlbV9hdm9pZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYWx0X2JyaWVmLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9hdWRpb190cmFuc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZWRpYV9saXZlX2NhcHRpb25lZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfdHJhY2tfYXZhaWxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3JlZGlyZWN0X29wdGlvbmFsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3JlZnJlc2hfZGVsYXkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21ldGFfdmlld3BvcnRfem9vbWFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL25vZW1iZWRfY29udGVudF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL29iamVjdF90ZXh0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvcGFnZV90aXRsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3BhZ2VfdGl0bGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9mb2N1c19ibHVyX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X29uY2xpY2tfYXZvaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9vbmNsaWNrX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc2NyaXB0X3NlbGVjdF9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NlbGVjdF9vcHRpb25zX2dyb3VwZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NraXBfbWFpbl9kZXNjcmliZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NraXBfbWFpbl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfY29sb3JfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9mb2N1c192aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfaG92ZXJfcGVyc2lzdGVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdmdfZ3JhcGhpY3NfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2FyaWFfZGVzY2VuZGFudHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2NhcHRpb25fZW1wdHkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2NhcHRpb25fbmVzdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19yZWZfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfcmVsYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfbGF5b3V0X2xpbmVhcml6ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3Njb3BlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zdW1tYXJ5X3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9ibG9ja19oZWFkaW5nLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfcXVvdGVkX2NvcnJlY3RseS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9zZW5zb3J5X21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9zcGFjaW5nX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3doaXRlc3BhY2VfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3dpZGdldF90YWJiYWJsZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3dpZGdldF90YWJiYWJsZV9zaW5nbGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzZXRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0FjY05hbWVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0FyaWFVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NTU1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ2FjaGVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NvbG9yVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9Db21tb25VdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL1RhYmxlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9WaXNVdGlsLnRzIiwid2VicGFjazovL2FjZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKmdsb2JhbCBPcGVuQWpheCovXG4vLyBhbGwgcmVmZXJlbmNlcyB0byBXQUktQVJJQSBzcGVjaWZpY2F0aW9uIGlzIHRoZSBXQUktQVJJQSAxLjJcbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvXG5cbmV4cG9ydCB0eXBlIElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSB7XG4gICAgaW1wbGljaXRSb2xlOiBzdHJpbmdbXSxcbiAgICB2YWxpZFJvbGVzOiBzdHJpbmdbXSxcbiAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBib29sZWFuLFxuICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzPzogc3RyaW5nW10sIFxuICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzPzogc3RyaW5nW10sXG4gICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgLy9yb2xlcywgb3RoZXIgdGhhbiBpbXBsaWNpdCBhbmQgdmFsaWQgcm9sZXMsIHdob3NlIGF0dHJpYnV0ZXMgYXJlIGFsc28gYWxsb3dlZFxuICAgIC8vIGEgZmV3IGVsZW1lbnRzIChzdWNoIGFzIGRhdGFsaXN0LCBodG1sLCBjYXB0aW9uKSB0aGF0IGhhdmUgYW4gaW1wbGljaXQgcm9sZSBidXQgZGlzYWxsb3cgc29tZSBvciBhbGwgYXR0cmlidXRlcyBhbGxvd2VkIGZvciB0aGUgcm9sZS5cbiAgICBhbGxvd0F0dHJpYnV0ZXNGcm9tSW1wbGljaXRSb2xlPzogYm9vbGVhbixcbiAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU/OiBzdHJpbmdbXSAgLy9zb21lIGVsZW1lbnRzICh2YXIsYWJiciBldGMuKSBoYXZlIG5vIGltcGxpY2l0IHJvbGUgYnV0IG5hbWluZyBwcm9oaWJpdGVkICAgXG59XG5cbmV4cG9ydCBjbGFzcyBBUklBRGVmaW5pdGlvbnMge1xuICAgIHN0YXRpYyBuYW1lRnJvbUNvbnRlbnQocm9sZTogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogYXJyYXkgb2YgV0FJLUFSSUEgZ2xvYmFsIHN0YXRlcyBhbmQgcHJvcGVydGllc1xuICAgICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi8jZ2xvYmFsX3N0YXRlc1xuICAgICAqL1xuICAgIHN0YXRpYyBnbG9iYWxQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXCJhcmlhLWF0b21pY1wiLCBcImFyaWEtYnVzeVwiLCBcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWN1cnJlbnRcIiwgXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIFxuICAgICAgICBcImFyaWEtZGV0YWlsc1wiLCBcImFyaWEtZmxvd3RvXCIsIFwiYXJpYS1oaWRkZW5cIiwgXCJhcmlhLWtleXNob3J0Y3V0c1wiLFxuICAgICAgICBcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLWxpdmVcIiwgXCJhcmlhLW93bnNcIiwgXCJhcmlhLXJlbGV2YW50XCIsIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIlxuICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBkZXByZWNhdGVkIGluIEFSSUEgMS4yLCB3aWxsIGluZGljYXRlIGRlcHJlY2F0aW9uIGluIGluZGl2aWR1YWwgcm9sZVxuICAgICAgICAsICdhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ1xuICAgIF07XG5cbiAgICAvL3Byb3BlcnRpZXMgY29udGFpbnMgaWQocykgdGhhdCByZWZlciB0byBvdGhlciBlbGVtZW50KHMpXG4gICAgc3RhdGljIHJlZmVyZW5jZVByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcImFyaWEtb3duc1wiLCBcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWRlc2NyaWJlZGJ5XCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1mbG93dG9cIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIl07XG5cbiAgICAvLyBkZXByZWNhdGVkIHJvbGVzXG4gICAgc3RhdGljIGdsb2JhbERlcHJlY2F0ZWRSb2xlcyA6IHN0cmluZ1tdID0gW1xuICAgICAgICAnZGlyZWN0b3J5JywgJ2RvYy1iaWJsaW9lbnRyeScsICdkb2MtZW5kbm90ZSdcbiAgICBdO1xuXG4gICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgZGVwcmVjYXRlZCBpbiBBUklBIDEuMSBmb3IgYWxsIHRoZSByb2xlc1xuICAgIHN0YXRpYyBnbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYXJpYS1ncmFiYmVkJywgJ2FyaWEtZHJvcGVmZmVjdCdcbiAgICBdO1xuICAgIFxuICAgIC8qXG4gICAgICogWFNEIGRhdGEgdHlwZXMgZm9yIGFsbCBXQUktQVJJQSBwcm9wZXJ0aWVzXG4gICAgICogYWxvbmcgd2l0aCB2YWxpZCB2YWx1ZXMgd2hlbiB0aGUgZGF0YSB0eXBlIGlzIE5NVE9LRU5cbiAgICAgKiBXQUktQVJJQSBwcm9wZXJ0aWVzIGRhdGEgdHlwZXMgZXhwbGFuZWQ6XG4gICAgICogIHR5cGU6IFVzZWQgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgdmFsdWVzIGFsbG93ZWQgZm9yIHRoZSBXQUktQVJJQSBwcm9wZXJ0eVxuICAgICAqICB2YWx1ZXM6IFVzZWQgdG8gaWRlbnRpZnkgc3BlY2lmaWMgdmFsdWVzIG9mIGFuIFdBSS1BUklBIHByb3BlcnR5IHdoZW4gdHlwZSBpcyBubXRva2VuXG4gICAgICogIGhpZGRlbklEUmVmU3VwcG9ydGVkOiBVc2VkIHRvIGlkZW50aWZ5IGlmIHRoZSBXQUktQVJJQSBwcm9wZXJ0eSBzdXBwb3J0cyByZWZlcmVuY2luZyBoaWRkZW4gSURcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZTogcmVmZXJzIHRvIFdBSS1BUklBIHByb3BlcnR5IHN1cHBvcnRzIGhpZGRlbiBJRCByZWZlcmVuY2VzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlOiByZWZlcnMgdG8gV0FJLUFSSUEgcHJvcGVydHkgZG9lcyBub3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNldCB0byBmYWxzZSwgaWYgbm90IHNwZWNpZmllZC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcHJvcGVydHlEYXRhVHlwZXMgOiB7IFxuICAgICAgICBbcHJvcDogc3RyaW5nXSA6IHsgXG4gICAgICAgICAgICB0eXBlOiBzdHJpbmcsIFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgdmFsdWVzPzogc3RyaW5nW10gXG4gICAgICAgIH1cbiAgICB9ID0ge1xuICAgICAgICBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYXRvbWljXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImlubGluZVwiLCBcImxpc3RcIiwgXCJib3RoXCIsIFwibm9uZVwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgdG8gaGFuZGxlIHZhbHVlIGVtcHR5XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1idXN5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtaXhlZFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29sY291bnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29saW5kZXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29sc3BhblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jb250cm9sc1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInBhZ2VcIiwgXCJzdGVwXCIsIFwibG9jYXRpb25cIiwgXCJkYXRlXCIsIFwidGltZVwiLCBcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgZm9yIGVtcHR5IHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kZXNjcmliZWRieVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRldGFpbHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRyb3BlZmZlY3RcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJjb3B5XCIsIFwibW92ZVwiLCBcImxpbmtcIiwgXCJleGVjdXRlXCIsIFwicG9wdXBcIiwgXCJub25lXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWZsb3d0b1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1ncmFiYmVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtZW51XCIsIFwibGlzdGJveFwiLCBcInRyZWVcIiwgXCJncmlkXCIsIFwiZGlhbG9nXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwic3BlbGxpbmdcIiwgXCJncmFtbWFyXCIsIFwidW5kZWZpbmVkXCJdIC8vYWRkIHVuZGVmaW5lZCBmb3IgZW1wdHkgdmFsdWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWtleXNob3J0Y3V0c1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGV2ZWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wib2ZmXCIsIFwicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tb2RhbFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJob3Jpem9udGFsXCIsIFwidmVydGljYWxcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW93bnNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wb3NpbnNldFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJtaXhlZFwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVhZG9ubHlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlbGV2YW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiYWRkaXRpb25zXCIsIFwicmVtb3ZhbHNcIiwgXCJ0ZXh0XCIsIFwiYWxsXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd2NvdW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd2luZGV4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInVuZGVmaW5lZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc2V0c2l6ZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1zb3J0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJhc2NlbmRpbmdcIiwgXCJkZXNjZW5kaW5nXCIsIFwib3RoZXJcIiwgXCJub25lXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbm93XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZXRleHRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBkZXNpZ24gcGF0dGVybnMgZm9yIGNvbmNyZXRlIFdBSS1BUklBIHJvbGVzXG4gICAgICogbGVnaXRpbWF0ZSBrZXlzIGZvciBlYWNoIHJvbGUgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gY29udGFpbmVyOiBhcHByb3ByaWF0ZSBjb250YWluZXIocykgZm9yIHRoYXQgcm9sZVxuICAgICAqIC0gcHJvcHM6IHN0YXRlcyBhbmQgcHJvcGVydGllcyB0aGF0IG1heSBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb2xlIChpbiBhZGRpdGlvbiB0byB0aGUgZ2xvYmFsIHN0YXRlcyBhbmQgcHJvcGVydGllcyBsaXN0ZWQgYWJvdmUpXG4gICAgICogLSByZXFQcm9wczogcmVxdWlyZWQgc3RhdGVzIG9yIHByb3BlcnRpZXMgZm9yIHRoaXMgcm9sZVxuICAgICAqIC0gcmVxQ2hpbGRyZW46IHJlcXVpcmVkIGNoaWxkcmVuIGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIGh0bWxFcXVpdjogSFRNTCBlcXVpdmFsZW50IGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIHJvbGVUeXBlOiBvbmUgb2Ygd2lkZ2V0LCBzdHJ1Y3R1cmUsIGxhbmRtYXJrLCBsaXZlUmVnaW9uLCB3aW5kb3cgKGFzIHNlZW4gaW4gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLTEuMi8jcm9sZXNfY2F0ZWdvcml6YXRpb24pXG4gICAgICogLSBuYW1lUmVxdWlyZWQ6IGRldGVybWluZXMgd2hldGhlciBhbiBhY2Nlc3NpYmxlIG5hbWUgaXMgcmVxdWlyZWQgZm9yIGEgd2lkZ2V0IChzZWUgQVJJQSBzcGVjLilcbiAgICAgKiAtIG5hbWVGcm9tOiBkZXRlcm1pbmVzIGhvdyBhbiBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgKGF1dGhvciBvciBjb250ZW50IC0gc2VlIEFSSUEgc3BlYy4pXG4gICAgICogLSBkZXByZWNhdGVkOiBpZiBwcmVzZW50LCBpbmRpY2F0ZXMgdGhhdCB0aGUgcm9sZSBpcyBkZXByZWNhdGVkLCBhbmQgcHJvdmlkZXMgYSBsaXN0IG9mIGFsdGVybmF0aXZlIHJvbGUocylcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzaWduUGF0dGVybnMgOiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcHJvcHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IHN0cmluZ1tdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBzdHJpbmcsXG4gICAgICAgICAgICByb2xlVHlwZT86IHN0cmluZyxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICBuYW1lRnJvbT86IHN0cmluZ1tdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbj86IGJvb2xlYW4sXG4gICAgICAgICAgICBkZXByZWNhdGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wcz86IHN0cmluZ1tdXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM/OiBzdHJpbmdbXVxuICAgICAgICB9XG4gICAgfSA9IHtcbiAgICAgICAgXCJhbGVydFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhbGVydGRpYWxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1tb2RhbFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aW5kb3dcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXBwbGljYXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIGNhbiBiZSBcIndpZGdldFwiXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYXJ0aWNsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmFubmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJsb2NrcXVvdGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcHJlc3NlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYnV0dG9uIHwgaW5wdXRbQHR5cGU9J2J1dHRvbiddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZmlndXJlXCIsIFwiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdjaGVja2JveCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29kZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbHVtbmhlYWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNvcnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRoW0BzY29wZT0nY29sJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sIC8vIGFyaWEtY29udHJvbHMgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQgd2hlbiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tcGxlbWVudGFyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21tZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb250ZW50aW5mb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWZpbml0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVsZXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXJlY3RvcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJkb2MtYWJzdHJhY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFja25vd2xlZGdtZW50c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYWZ0ZXJ3b3JkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hcHBlbmRpeFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmFja2xpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb2VudHJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9ncmFwaHlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY2hhcHRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29sb3Bob25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29uY2x1c2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY292ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1jcmVkaXRzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1kZWRpY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lbmRub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXBpZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWxvZ3VlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcnJhdGFcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWV4YW1wbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWZvb3Rub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb3Jld29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZ2xvc3NhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1pbmRleFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW50cm9kdWN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RlcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RpY2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlYnJlYWtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlbGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWZvb3RlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2VoZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcmVmYWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcm9sb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHVsbHF1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcW5hXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1zdWJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdG9jXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmZWVkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImZvcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImZvcm1cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdlbmVyaWNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImRpdiB8IHNwYW5cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIiwgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJncmFwaGljcy1kb2N1bWVudFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyYXBoaWNzLW9iamVjdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmFwaGljcy1zeW1ib2xcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JpZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiXSwgLy8gcm93Z3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRhYmxlXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImdyaWRjZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiLCBcImFyaWEtaW52YWxpZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImhlYWRpbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1sZXZlbFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImgxIHwgaDIgfCBoMyB8IGg0IHwgaDUgfCBoNlwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbnNlcnRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaW5rXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwib2wgfCB1bFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3Rib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwib3B0aW9uXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJsaVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1haW5cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFya1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibWFya1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJxdWVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWF0aFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1yYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJuYXZpZ2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vbmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBsaXN0Ym94XG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtY2hlY2tlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gXCJhcmlhLXNlbGVjdGVkXCIgaGFzIGEgZGVmYXVsdFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwib3B0aW9uXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInBhcmFncmFwaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInByZXNlbnRhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0ncmFkaW8nXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyYWRpb2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyYWRpb1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyZWdpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JpZFwiLCBcInJvd2dyb3VwXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJjZWxsXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwiZ3JpZGNlbGxcIiwgXCJyb3doZWFkZXJcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidHJcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3dncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyaWRcIiwgXCJ0YWJsZVwiLCBcInRyZWVncmlkXCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRib2R5IHwgdGZvb3QgfCB0aGVhZFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd2hlYWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNvcnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRoW0BzY29wZT0ncm93J11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzY3JvbGxiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY29udHJvbHNcIiwgXCJhcmlhLXZhbHVlbm93XCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNlYXJjaGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1hdXRvY29tcGxldGVcIiwgXCJhcmlhLW11bHRpbGluZVwiLCBcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3NlYXJjaCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInNlcGFyYXRvclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiXSwgLy8gYXJpYS1kaXNhYmxlZCwgYXJpYS12YWx1ZW1heCwgYXJpYS12YWx1ZW1pbiwgYXJpYS12YWx1ZXRleHQgYXJlIHZhbGlkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsIC8vIGFyaWEtdmFsdWVub3cgaXMgcmVxdWlyZWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLCAvLyBvciB3aWRnZXQgaWYgZm9jdXNhYmxlXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2xpZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3BpbmJ1dHRvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWVub3dcIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3RhdHVzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3Ryb25nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3Vic2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3VnZ2VzdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1cGVyc2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3dpdGNoXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFiXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1widGFibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2VsZWN0ZWRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFibGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29sY291bnRcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIiwgXCJjYXB0aW9uXCJdLCAvLyByb3dncm91cCBhbmQgY2FwdGlvbiBhcmUgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRhYmxlXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFibGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1widGFiXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYnBhbmVsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0ZXJtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJkZm5cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGV4dGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1hdXRvY29tcGxldGVcIiwgXCJhcmlhLW11bHRpbGluZVwiLCBcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J3RleHQnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGltZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidG9vbHRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIC8vIEFSSUEgMS4yIGhhcyB0aGlzIGFzIG5hbWVSZXF1aXJlZDogdHJ1ZSwgYnV0IEFSSUEgMS4zIHJlbW92ZWQgaXQgYmVjYXVzZSBpdCBtYWtlcyBubyBzZW5zZSB0byByZXF1aXJlIGEgbmFtZSBvbiBhIHRvb2x0aXAuXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImdyb3VwXCIsIFwidHJlZWl0ZW1cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCJdLCAvLyByb3dncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidHJlZWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jaGVja2VkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbGV2ZWxcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICB9IC8vIGVuZCBkZXNpZ25QYXR0ZXJuc1xuXG4gICAgLy8gY29waWVkIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLW90aGVyLmh0bWwjZGlzYWJsZWQtZWxlbWVudHNcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZERpc2FibGVkID0gW1wiYnV0dG9uXCIsIFwiaW5wdXRcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZmllbGRzZXRcIl07IC8vIGFsc28gZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZFJlcXVpcmVkID0gW1wic2VsZWN0XCIsIFwidGV4dGFyZWFcIl07IC8vIHJlbW92ZSAnaW5wdXQnIGFuZCBhZGQgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVudCwgYmVjdWFzZSByZXF1aXJlZCBpcyBub3Qgc3VwcG9ydGVkIG9uIGlucHV0QHR5cGU9XCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiaGlkZGVuXCIgb3IgYW55IGJ1dHRvbiB0eXBlc1xuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZWFkT25seSA9IFtcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY2F1c2UgcmVhZG9ubHkgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJmaWxlXCIsIGhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcblxuXG4gICAgLyogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYXJpYS8jZG9jY29uZm9ybWFuY2VcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgY29udGFpbnMgcHJvcGVydGllcyBvZiB0aGUgdGFncyByZWxhdGVkIHRvIHJvbGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFncyBjb250YWlucyB0aG9zZSB0YWdzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIGNvbnNpZGVyYXRpb25zXG4gICAgICAgICovXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXTogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYWJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFydGljbGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJtYWluXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhc2lkZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvb3Rub3RlXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy10aXBcIiwgXCJmZWVkXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXVkaW9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmFzZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZGlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJkb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmxvY2txdW90ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJsb2NrcXVvdGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYm9keVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS1oaWRkZW4nXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsXCJzZXBhcmF0b3JcIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYW52YXNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNhcHRpb25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2NhcHRpb24nXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29kZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2xcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGZuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkaWFsb2dcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydGRpYWxvZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICBcImRsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXJtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZW1cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtYmVkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImZpZWxkc2V0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZm9ybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg1XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDZcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlcGFyYXRvclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1wYWdlYnJlYWtcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImh0bWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkb2N1bWVudFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImluc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImluc2VydGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJrYmRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxhYmVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGVnZW5kXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlua1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYWluXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWFpblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtYXRoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZXRlclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1ldGVyXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogWydhcmlhLXZhbHVlbWF4JywgJ2FyaWEtdmFsdWVtaW4nXSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibmF2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1pbmRleFwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy10b2NcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInRhYmxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vc2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0Z3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wib3B0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1zZWxlY3RlZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm91dHB1dFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0YXR1c1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicGFyYWdyYXBoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInBpY3R1cmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInByZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJwcm9ncmVzc2JhclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIl0gXG4gICAgICAgIH0sXG4gICAgICAgIFwicVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicnBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJ0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJydWJ5XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzYW1wXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzY3JpcHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydzZWFyY2gnXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFsnc2VhcmNoJywgJ2Zvcm0nLCAnZ3JvdXAnLCAnbm9uZScsICdwcmVzZW50YXRpb24nLCAncmVnaW9uJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2xvdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbWFsbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNwYW5cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0cm9uZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHlsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdWJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdWJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3VwZXJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ZnXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JhcGhpY3MtZG9jdW1lbnRcIl0sIC8vIGFzIGRlZmluZWQgYnkgU1ZHIEFBTVxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGFibGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGVtcGxhdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0Zm9vdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRoZWFkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRpbWVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGl0bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidHJhY2tcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2YXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcInZpZGVvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIndiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzOiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddIDogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgICAgICB9IHwgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYVwiOiB7XG4gICAgICAgICAgICBcIndpdGgtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub24tZW1wdHkgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiZG9jLWJhY2tsaW5rXCIsIFwiZG9jLWJpYmxpb3JlZlwiLCBcImRvYy1nbG9zc3JlZlwiLCBcImRvYy1ub3RlcmVmXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1kaXNhYmxlZD10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyZWFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBocmVmIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiYXV0b25vbW91cyBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlIG5vIGNvcnJlc3BvbmRpbmcgcm9sZS5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiYW55IHJvbGVcIiwgXCJubyByb2xlIE90aGVyd2lzZVwiXSxcbi8vICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuLy8gICAgICAgIH0sXG4gICAgICAgIFwiZGl2XCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZGxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1maWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ2RvYy1leGFtcGxlJ10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb290ZXJcIjoge1xuICAgICAgICAgICAgXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZm9vdG5vdGVcIiwgXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29udGVudGluZm9cIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZm9vdG5vdGVcIiwgXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XCI6IHtcbi8vICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJSb2xlIGV4cG9zZWQgZnJvbSBhdXRob3IgZGVmaW5lZCBFbGVtZW50SW50ZXJuYWxzLiBPdGhlcndpc2UgJ2dlbmVyaWMnLlwiXSxcbi8vICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiSWYgcm9sZSBkZWZpbmVkIGJ5IEVsZW1lbnRJbnRlcm5hbHNcIiwgXCJmb3JtLXJlbGF0ZWQgcm9sZXM6IGJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwicmFkaW9ncm91cFwiLCBcInNlYXJjaGJveFwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIiwgXCJzd2l0Y2hcIiwgXCJ0ZXh0Ym94XCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuXG4gICAgICAgIFwiaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJhbm5lclwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm90IGEgZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbWdcIjoge1xuICAgICAgICAgICAgXCJpbWctd2l0aC1hY2NuYW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImltZ1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwid2hlbiBhY2Nlc3NpYmxlIG5hbWUgcHJlc2VudHNcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1jb3ZlclwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwibWV0ZXJcIiwgXCJvcHRpb25cIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwic2Nyb2xsYmFyXCIsIFwic2VwYXJhdG9yXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwid2hlbiBubyBhY2Nlc3NpYmxlIG5hbWUgcHJlc2VudHMgYW5kIGFsdD0nJ1wiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsIFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlbj10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWctd2l0aG91dC1hY2NuYW1lLW5vLWFsdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gbmVpdGhlciBhY2Nlc3NpYmxlIG5hbWUgbm8gYWx0IHByZXNlbnRzXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuPXRydWVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnB1dFwiOiB7XG4gICAgICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGgtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbWNoZWNrYm94XCIsIFwib3B0aW9uXCIsIFwic3dpdGNoXCIsIFwiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9Y2hlY2tib3ggYW5kIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbWNoZWNrYm94XCIsIFwib3B0aW9uXCIsIFwic3dpdGNoXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRhdGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVtYWlsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggdHlwZT1lbWFpbCBhbmQgbm8gbGlzdCBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaGlkZGVuXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibW9udGhcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm51bWJlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGFzc3dvcmRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1yYWRpb1wiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhbmdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNsaWRlclwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyZXNldFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlYXJjaGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VhcmNoLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInN1Ym1pdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjb21ib2JveFwiLCBcInNlYXJjaGJveFwiLCBcInNwaW5idXR0b25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0LXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgICAgICAvLyBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oYXNwb3B1cFwiXSAgLy8gY292ZXJlZCBpbiBhIGRpZmZlcmVudCBydWxlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVmYXVsdC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gaW5wdXQgd2l0aCBhIG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlLCB3aXRoIGEgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGlcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1vZi1saXN0LXJvbGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydsaXN0aXRlbSddLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnZ2VuZXJpYyddLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VjdGlvblwiOiB7XG4gICAgICAgICAgICBcIndpdGgtbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyZWdpb25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZGlhbG9nXCIsIFwiZG9jLWFic3RyYWN0XCIsIFwiZG9jLWFja25vd2xlZGdtZW50c1wiLCBcImRvYy1hZnRlcndvcmRcIiwgXCJkb2MtYXBwZW5kaXhcIiwgXCJkb2MtYmlibGlvZ3JhcGh5XCIsIFwiZG9jLWNoYXB0ZXJcIiwgXCJkb2MtY29sb3Bob25cIiwgXCJkb2MtY29uY2x1c2lvblwiLCBcImRvYy1jcmVkaXRcIiwgXCJkb2MtY3JlZGl0c1wiLCBcImRvYy1kZWRpY2F0aW9uXCIsIFwiZG9jLWVuZG5vdGVzXCIsIFwiZG9jLWVwaWdyYXBoXCIsIFwiZG9jLWVwaWxvZ3VlXCIsIFwiZG9jLWVycmF0YVwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvcmV3b3JkXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLWluZGV4XCIsIFwiZG9jLWludHJvZHVjdGlvblwiLCBcImRvYy1ub3RpY2VcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtcGFydFwiLCBcImRvYy1wcmVmYWNlXCIsIFwiZG9jLXByb2xvZ3VlXCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy1xbmFcIiwgXCJkb2MtdG9jXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwiZ3JvdXBcIiwgXCJsb2dcIiwgXCJtYWluXCIsIFwibWFycXVlZVwiLCBcIm5hdmlnYXRpb25cIiwgXCJub25lXCIsIFwibm90ZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInNlYXJjaFwiLCBcInN0YXR1c1wiLCBcInRhYnBhbmVsXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IHtcbiAgICAgICAgICAgIFwibm8tbXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiOiB7XG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIGEgbXVsdGlwbGUgYXR0cmlidXRlIG9yIGEgc2l6ZSBhdHRyaWJ1dGUgaGF2aW5nIHZhbHVlIGdyZWF0ZXIgdGhhbiAxXCJcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1tdWx0aXNlbGVjdGFibGVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBubyBtdWx0aXBsZSBhdHRyaWJ1dGUgYW5kIG5vIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1tdWx0aXNlbGVjdGFibGVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdW1tYXJ5XCI6IHtcbiAgICAgICAgICAgIFwiZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1maXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGJvZHlcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGRcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyaWRjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyaWRjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aFwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZS1ncmlkLXRyZWVncmlkLXJvdy1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3doZWFkZXJcIiwgXCJjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlLWdyaWQtdHJlZWdyaWQtY29sdW1uLXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbHVtbmhlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJkZWZhdWx0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCJcIixcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIG9mIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzXG5cbiAgICAvLyBtYXAgYXJpYSBhdHRyaWJ1dGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGF0dHJpYnV0ZSwgYXBwbHkgdG8gYW55IGVsZW1lbnQgYXBwbGljYWJsZVxuICAgIC8vIG5vdGUgdGhpcyBtYXBwaW5nIGlzIGZvciB0aGUgcmVsYXRlZCBhdHRyaWJ1dGVzIGluIHRoZSBzYW1lIGVsZW1lbnQgd2l0aG91dCBjaGVja2luZyB0aGUgcGFyZW50IHRyZWUuXG4gICAgLy8gcmVmZXIgdG8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2h0bWwtYXJpYS9cbiAgICBzdGF0aWMgcmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlczoge1xuICAgICAgICBbYXJpYUF0dHI6IHN0cmluZ10gOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVtdLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc/OiB7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVtdXG4gICAgICAgIH0gXG4gICAgfSA9ICB7XG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImRpc2FibGVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJoaWRkZW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiaGlkZGVuLG51bGxcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJ1bnRpbC1mb3VuZFwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJoaWRkZW4sbnVsbFwiXVxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJwbGFjZWhvbGRlclwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcIm1heFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICAgICAgLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOiBBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtYXggb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtYXggYXR0cmlidXRlLiBVc2UgdGhlIG1heCBhdHRyaWJ1dGUgaW5zdGVhZC4gXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWluXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAvLy8vb3ZlcmxhcCBjYXNlIGNvdmVyZWQgaW4gdGhlIHJvbGUgZGVmaW5pdGlvbjpBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtaW4gb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtaW4gYXR0cmlidXRlLiBVc2UgdGhlIG1pbiBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwiZmFsc2VcIiwgXCJmYWxzZVwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwidHJ1ZVwiLCBcInRydWVcIl1cbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIFwiYXJpYS1jb2xzcGFuXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIlZBTFVFXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjb2xzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIlZBTFVFXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0c1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJvd3NwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgXG4gICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCBvY2N1cnMgaWYgYm90aCBleGlzdHMgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICAvKiogXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCBleGlzdHMsIGFyaWEgdmFsdWUgaXMgb25seSBmb3IgY3VzdG9tIHdpZGdldCwgcmF0aGVyIHRoYW4gbmF0aXZlXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiYXV0b2NvbXBsZXRlXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0gKi8gXG4gICAgfVxuXG4gICAgc3RhdGljIGNvbnRhaW5lcnMgPSBbXVxufTtcblxubGV0IGNvbnRhaW5lckFycmF5ID0gW107XG5cbmZvciAoY29uc3Qgcm9sZURlc2lnbiBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIHtcbiAgICBjb25zdCBjb250YWluZXJzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVEZXNpZ25dLmNvbnRhaW5lcjtcbiAgICBpZiAoY29udGFpbmVycyAhPT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiBjb250YWluZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyQXJyYXkuaW5kZXhPZihjb250YWluZXIpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyQXJyYXkucHVzaChjb250YWluZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuQVJJQURlZmluaXRpb25zLmNvbnRhaW5lcnMgPSBjb250YWluZXJBcnJheTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4vQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgQVJJQVdhbGtlciB9IGZyb20gXCIuL0FSSUFXYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQWNjTmFtZVV0aWxcIjtcblxudHlwZSBFbGVtQ2FsYyA9IChlbGVtOiBFbGVtZW50KSA9PiBzdHJpbmc7XG50eXBlIE5vZGVDYWxjID0gKG5vZGU6IE5vZGUpID0+IHN0cmluZztcblxuZXhwb3J0IGNsYXNzIEFSSUFNYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGUobm9kZTogTm9kZSwgcm9sZTogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAvLyAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gIShyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucyAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucHJlc2VudGF0aW9uYWxDaGlsZHJlbik7XG4gICAgfVxuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5vZGUpO1xuICAgICAgICByZXR1cm4gcm9sZTtcbiAgICB9XG4gICAgZ2V0TmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImFyaWFcIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8ZWxlbS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5mbyA9IGVsZW0uYXR0cmlidXRlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBhdHRySW5mby5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImFyaWEtXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFtuYW1lLnN1YnN0cmluZyg1KV0gPSBhdHRySW5mby5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYXBwbHlBdHRyUm9sZT0gZnVuY3Rpb24obm9kZU5hbWU6c3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgaW4gQVJJQU1hcHBlci5lbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnMpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIEFSSUFNYXBwZXIuZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzW25vZGVOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShhdHRyIGluIHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IEFSSUFNYXBwZXIuZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzW25vZGVOYW1lXVthdHRyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IHR5cGVvZiBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIGFzIE5vZGVDYWxjKShlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXBwbHlBdHRyUm9sZShcImdsb2JhbFwiKTtcbiAgICAgICAgICAgIGFwcGx5QXR0clJvbGUobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gQVJJQU1hcHBlci50ZXh0QXR0clZhbHVlQ2FsY3VsYXRvcnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gQVJJQU1hcHBlci50ZXh0QXR0clZhbHVlQ2FsY3VsYXRvcnNbYXR0cl0obm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgIT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRBcmlhT3duZWRCeShlbGVtOiBIVE1MRWxlbWVudCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChlbGVtKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG93bmVycyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiW2FyaWEtb3duc11cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpT3duZXIgPSAwOyBpT3duZXIgPCBvd25lcnMubGVuZ3RoOyArK2lPd25lcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG93bmVyID0gb3duZXJzW2lPd25lcl07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duSWRzID0gb3duZXIuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpSWQ9MDsgaUlkIDwgb3duSWRzLmxlbmd0aDsgKytpSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lJZF0pO1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWQgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZXIsIG93bmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG93bmVkLCBcImFyaWEtb3duZWRcIiwgb3duZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJBUklBTWFwcGVyOjpwcmVjYWxjT3duZWRcIiwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcImFyaWEtb3duZWRcIiwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50SGllcmFyY2h5ID0gdGhpcy5nZXROb2RlSGllcmFyY2h5KERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpKTtcbiAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICByb2xlOiBcIlwiLFxuICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5ID0gW107XG4gICAgICAgICAgICAvLyBTZXQgaGllcmFyY2h5XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50SGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICAgICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKG5vZGUpLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgIHJvbGU6IHRoaXMuZ2V0Um9sZShub2RlKSB8fCBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIisodGhpcy5nZXRSb2xlKG5vZGUpIHx8IFwibm9uZVwiKSxcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHBhcmVudEluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhpZXJhcmNoeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGxldCBub2RlSGllcmFyY2h5IDogQXJyYXk8e1xuICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IGJvb2xlYW5cbiAgICAgICAgICAgIH0+ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBudWxsKTtcbiAgICAgICAgICAgIGlmICghbm9kZUhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgZWxlbWVudCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0IC0gYnV0IDo6cmVzZXQgcHJvY2Vzc2VzIHRoZW0gYWxsIGluIHRoZSByaWdodCBvcmRlclxuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGRldGFpbHMgYWJvdXQgdGhlIGNvcnJlY3QgcGFyZW50IGZpcnN0XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMSkgeyBcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5Lmxlbmd0aCA+IDAgPyBwYXJlbnRIaWVyYXJjaHlbcGFyZW50SGllcmFyY2h5Lmxlbmd0aC0xXSA6IHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnRJbmZvLnJvbGUgPT09IFwibm9uZVwiIHx8IHBhcmVudEluZm8ucm9sZSA9PT0gXCIvbm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkocGFyZW50KSB8fCBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRIaWVyYXJjaHkgPSBwYXJlbnQgPyB0aGlzLmdldE5vZGVIaWVyYXJjaHkocGFyZW50KSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmZvID0gcGFyZW50SGllcmFyY2h5W3BhcmVudEhpZXJhcmNoeS5sZW5ndGgtMV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IGluaXRpYWwgbm9kZSBpbmZvXG4gICAgICAgICAgICAgICAgbGV0IG5vZGVJbmZvIDoge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYm91bmRzOiBhbnksXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBub2RlOiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiBib29sZWFuXG4gICAgICAgICAgICAgICAgfSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogZWxlbS5ub2RlVHlwZSA9PT0gMSA/IHRoaXMuZ2V0QXR0cmlidXRlcyhlbGVtKToge30sICAgXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kczogdGhpcy5nZXRCb3VuZHMoZWxlbSksXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogdGhpcy5nZXROYW1lc3BhY2UoKSxcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogZWxlbSxcbiAgICAgICAgICAgICAgICAgICAgcm9sZTogdGhpcy5nZXRSb2xlKGVsZW0pIHx8IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCByb2xlIGlmIHdlJ3JlIHdpdGhpbiBhIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbENvbnRhaW5lciA9ICFwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGU7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbmFsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGUgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlID0gcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5jaGlsZHJlbkNhbkhhdmVSb2xlKGVsZW0sIG5vZGVJbmZvLnJvbGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcGF0aHNcbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZm8ucm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0gPSAocGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0gfHwgMCkgKyAxOyBcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8ucm9sZVBhdGggPSBwYXJlbnRJbmZvLnJvbGVQYXRoK1wiL1wiK25vZGVJbmZvLnJvbGUrXCJbXCIrcGFyZW50SW5mby5yb2xlQ291bnRbbm9kZUluZm8ucm9sZV0rXCJdXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8ucm9sZVBhdGggPSBwYXJlbnRJbmZvLnJvbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gU2V0IGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkgPSBbXVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRIaWVyYXJjaHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5LnB1c2gobm9kZUluZm8pO1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkFSSUFNYXBwZXI6OmdldE5vZGVIaWVyYXJjaHlcIiwgbm9kZUhpZXJhcmNoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhpZXJhcmNoeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgQVJJQU1hcHBlci5uYW1lQ29tcHV0YXRpb25JZCA9IDA7XG4gICAgICAgIHRoaXMuaGllcmFyY2h5Um9sZSA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoID0gW3tcbiAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgcm9sZUNvdW50OiB7fVxuICAgICAgICB9XTtcbiAgICAgICAgLy8gR2V0IHRvIHRoZSB0b3Btb3N0IG5vZGVcbiAgICAgICAgbGV0IGdvb2ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IG5leHQ7XG4gICAgICAgIHdoaWxlIChuZXh0ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZ29vZE5vZGUpKSB7XG4gICAgICAgICAgICBnb29kTm9kZSA9IG5leHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFdhbGsgdGhlIHRyZWUgYW5kIHNldCB0aGUgaGllcmFyY2hpZXMgaW4gdGhlIHJpZ2h0IG9yZGVyXG4gICAgICAgIGxldCBhcmlhV2Fsa2VyID0gbmV3IEFSSUFXYWxrZXIoZ29vZE5vZGUsIGZhbHNlLCBnb29kTm9kZSk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChhcmlhV2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldE5vZGVIaWVyYXJjaHkoYXJpYVdhbGtlci5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYXJpYVdhbGtlci5uZXh0Tm9kZSgpKTtcbiAgICB9XG5cbiAgICBvcGVuU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGlmICh0aGlzLmhpZXJhcmNoeVJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KG5vZGUpXG4gICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8dGhpcy5oaWVyYXJjaHlSZXN1bHRzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlWzBdID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgPSB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oaWVyYXJjaHlSZXN1bHRzO1xuICAgIH1cblxuICAgIHB1c2hIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICAvLyBJZiB3ZSdyZSBub3QgYW4gZWxlbWVudCwgbm8gc3BlY2lhbCBoYW5kbGluZ1xuICAgICAgICBsZXQgbm9kZUhpZXJhcmNoeSA9IFtdXG4gICAgICAgIC8vIERldGVybWluZSBvdXIgbm9kZSBpbmZvXG4gICAgICAgIG5vZGVIaWVyYXJjaHkgPSB0aGlzLmdldE5vZGVIaWVyYXJjaHkobm9kZSk7XG4gICAgICAgIGxldCBub2RlSW5mbyA9IG5vZGVIaWVyYXJjaHlbbm9kZUhpZXJhcmNoeS5sZW5ndGgtMV07XG4gICAgICAgIHRoaXMuaGllcmFyY2h5Um9sZS5wdXNoKG5vZGVJbmZvLnJvbGUpO1xuICAgICAgICBpZiAobm9kZUluZm8ucm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IG5vZGVIaWVyYXJjaHk7XG4gICAgfVxuXG4gICAgY2xvc2VTY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgbGV0IHJldFZhbCA6IElNYXBSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLmhpZXJhcmNoeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRlbXAgPSByZXMubm9kZTtcbiAgICAgICAgICAgIC8vIHJlcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGxldCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICAgICAgLy8gY2xvbmVkLm5vZGUgPSByZXMubm9kZSA9IHRlbXA7IFxuICAgICAgICAgICAgLy8gcmV0VmFsLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gcGFyZW50ID8gQ2FjaGVVdGlsLmdldENhY2hlKHBhcmVudCBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXROb2RlSW5mb1wiLCBbXSkgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zXG4gICAgLy8vL1xuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYWFtLTEuMC8jbWFwcGluZy1odG1sLXRvLWFjY2Vzc2liaWxpdHktYXBpc1xuICAgIHB1YmxpYyBzdGF0aWMgZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFtub2RlTmFtZTpzdHJpbmddOiB7IFthdHRyOnN0cmluZ106IHN0cmluZyB8IEVsZW1DYWxjIH19ID0ge1xuICAgICAgICBcImdsb2JhbFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lICAvL0FSSUFNYXBwZXIuY29tcHV0ZU5hbWVcbiAgICAgICAgfVxuICAgICAgICAsIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBkYXRhbGlzdCdzIHNlbGVjdGlvbiBtb2RlbCBhbGxvd3MgbXVsdGlwbGUgb3B0aW9uIGVsZW1lbnRzIHRvIGJlXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBhdCBhIHRpbWUsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFtsaXN0PSdcIitpZCtcIiddXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbS5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpPT1cIlwiKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImgxXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIxXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDJcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjJcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoM1wiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiM1wiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg0XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI0XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDVcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjVcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImlucHV0XCI6IHtcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cImNoZWNrYm94XCIgc3RhdGUgc2V0IHRvIFwibWl4ZWRcIiBpZiB0aGUgZWxlbWVudCdzIGluZGV0ZXJtaW5hdGUgSURMIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHRydWUsIG9yIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3MgY2hlY2tlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gLSB0eXBlPVwicmFkaW9cIiBzdGF0ZSBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBjaGVja2VkbmVzcyBpcyB0cnVlLCBvciBcImZhbHNlXCIgXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UuIFxuICAgICAgICAgICAgXCJjaGVja2VkXCI6IGVsZW0gPT4geyBcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImNoZWNrYm94XCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGVsZW0gYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSByZWZsZWN0aW5nIG51bWJlciBvZiB0eXBlPXJhZGlvIGlucHV0IGVsZW1lbnRzIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXBcbiAgICAgICAgICAgICwgXCJzZXRzaXplXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJyYWRpb1wiIGFuZCBub3QgaW4gbWVudSB2YWx1ZSByZWZsZWN0aW5nIHRoZSBlbGVtZW50cyBwb3NpdGlvbiBcbiAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwLlwiXG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIGlucHV0ICh0eXBlIGF0dHJpYnV0ZSBpbiB0aGUgVGV4dCwgU2VhcmNoLCBUZWxlcGhvbmUsIFVSTCwgb3IgRS1tYWlsIHN0YXRlcyB3aXRoIGEgXG4gICAgICAgICAgICAvLyBzdWdnZXN0aW9ucyBzb3VyY2UgZWxlbWVudCkgY29tYm9ib3ggcm9sZSwgd2l0aCB0aGUgYXJpYS1vd25zIHByb3BlcnR5IHNldCB0byB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gdmFsdWUgYXMgdGhlIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAsIFwib3duc1wiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICB9XG4gICAgICAgICwgXCJrZXlnZW5cIjoge1xuICAgICAgICAgICAgXCJtdWx0aXNlbGVjdGFibGVcIjogXCJmYWxzZVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImxpXCI6IHtcbiAgICAgICAgICAgIC8vIE51bWJlciBvZiBsaSBlbGVtZW50cyB3aXRoaW4gdGhlIG9sLCB1bCwgbWVudVxuICAgICAgICAgICAgXCJzZXRzaXplXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW0sIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGxpcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIik7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVybGlzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJvbCBsaSwgdWwgbGksIG1lbnUgbGlcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGxpcy5sZW5ndGgtb3RoZXJsaXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBvc2l0aW9uIG9mIGxpIGVsZW1lbnQgd2l0aGluIHRoZSBvbCwgdWwsIG1lbnVcbiAgICAgICAgICAgICwgXCJwb3NpbnNldFwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSlcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGxpcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwibGlcIik7XG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxsaXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGxpc1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQsIERPTVV0aWwuZ2V0QW5jZXN0b3IobGksIFtcIm9sXCIsIFwidWxcIiwgXCJtZW51XCJdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiK251bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICArK251bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcIm1lbnVpdGVtXCI6IHtcbiAgICAgICAgICAgIC8vIHR5cGUgPSBjaGVja2JveCBvciByYWRpbywgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSBcbiAgICAgICAgICAgIC8vIGlzIHByZXNlbnQsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSBcbiAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgLy8gc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3Mgc2VsZWN0ZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2UuXG4gICAgICAgICAgICBcInNlbGVjdGVkXCI6IGVsZW0gPT4gXCJcIishIShlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cInRydWVcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIpPT1cIlwiKSlcbiAgICAgICAgfVxuICAgICAgICAsIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZW1heFwiOiBlbGVtID0+IGVsZW0uZ2V0QXR0cmlidXRlKFwibWF4XCIpIHx8IFwiMVwiXG4gICAgICAgICAgICAsIFwidmFsdWVtaW5cIjogZWxlbSA9PiBcIjBcIlxuICAgICAgICAgICAgLCBcInZhbHVlbm93XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRleHRBdHRyVmFsdWVDYWxjdWxhdG9yczogeyBbYXR0cjpzdHJpbmddOiBOb2RlQ2FsYyB9ID0ge1xuICAgICAgICBcIm5hbWVcIjogbm9kZSA9PiBub2RlLm5vZGVWYWx1ZVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG5hbWVDb21wdXRhdGlvbklkID0gMDtcbiAgICAvKipwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lKGN1cjogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICArK0FSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQ7XG4gICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscChBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlTmFtZUhlbHAod2Fsa0lkOiBudW1iZXIsIGN1cjogTm9kZSwgbGFiZWxsZWRieVRyYXZlcnNlOiBib29sZWFuLCB3YWxrVHJhdmVyc2U6IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gMmcuIE5vbmUgb2YgdGhlIG90aGVyIGNvbnRlbnQgYXBwbGllcyB0byB0ZXh0IG5vZGVzLCBzbyBqdXN0IGRvIHRoaXMgZmlyc3RcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSA9PT0gMyApIHJldHVybiBjdXIubm9kZVZhbHVlO1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAxMSkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgIT09IDEgKSB7XG4gICAgICAgICAgICBpZiAod2Fsa1RyYXZlcnNlIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgKFwiQ2FuIG9ubHkgY29tcHV0ZSBuYW1lIG9uIEVsZW1lbnQgYW5kIFRleHQgXCIgKyBjdXIubm9kZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGN1ciBhcyBFbGVtZW50O1xuICAgICAgICAvLyBXZSd2ZSBiZWVuIGhlcmUgYmVmb3JlIC0gcHJldmVudCByZWN1cnNpb25cbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcImRhdGEtbmFtZXdhbGtcIiwgbnVsbCkgPT09IFwiXCIrd2Fsa0lkKSByZXR1cm4gXCJcIjtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBcIlwiK3dhbGtJZCk7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNpbnB1dC10eXBlLXRleHQtaW5wdXQtdHlwZS1wYXNzd29yZC1pbnB1dC10eXBlLXNlYXJjaC1pbnB1dC10eXBlLXRlbC1pbnB1dC10eXBlLXVybC1hbmQtdGV4dGFyZWEtZWxlbWVudFxuXG4gICAgICAgIC8vIDJhLiBPbmx5IHNob3cgaGlkZGVuIGNvbnRlbnQgaWYgaXQncyByZWZlcmVuY2VkIGJ5IGEgbGFiZWxsZWRieVxuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGN1cikpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmIuIGNvbGxlY3QgdmFsaWQgaWQgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsbGVkYnkgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBsZXQgdmFsaWRFbGVtcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbGFiZWxsZWRieSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChjdXIsIHJlZik7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkVsZW0gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgcmVmRWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRFbGVtcy5wdXNoKHJlZkVsZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWxpZEVsZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbSBvZiB2YWxpZEVsZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBlbGVtLCB0cnVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZC50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaW5jZSBub2RlVG9Sb2xlIGNhbGxzIGJhY2sgaGVyZSBmb3IgZm9ybSBhbmQgc2VjdGlvbiwgd2UgbmVlZCBzcGVjaWFsIGNhc2luZyBoZXJlIHRvIGhhbmRsZSB0aG9zZSB0d28gY2FzZXNcbiAgICAgICAgaWYgKFtcInNlY3Rpb25cIiwgXCJmb3JtXCJdLmluY2x1ZGVzKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBJJ20gbm90IGFuIGVtYmVkZGVkIGNvbnRyb2wgb3IgSSdtIG5vdCByZWN1cnNpbmcsIHJldHVybiB0aGUgYXJpYS1sYWJlbFxuICAgICAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmMuIElmIGxhYmVsIG9yIHdhbGssIGFuZCB0aGlzIGlzIGEgY29udHJvbCwgc2tpcCB0byB0aGUgdmFsdWUsIG90aGVyd2lzZSBwcm92aWRlIHRoZSBsYWJlbFxuICAgICAgICBjb25zdCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKGN1cik7XG4gICAgICAgIGxldCBpc0VtYmVkZGVkQ29udHJvbCA9IFtcbiAgICAgICAgICAgIFwidGV4dGJveFwiLCBcImJ1dHRvblwiLCBcImNvbWJvYm94XCIsIFwibGlzdGJveFwiLCBcbiAgICAgICAgICAgIFwicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJcbiAgICAgICAgXS5pbmNsdWRlcyhyb2xlKTtcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhd2Fsa1RyYXZlcnNlIHx8ICFpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMmQuIFxuICAgICAgICBpZiAocm9sZSAhPT0gXCJwcmVzZW50YXRpb25cIiAmJiByb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgaWYgKChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiB8fCBjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhcmVhXCIpICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKGVsZW0uZ2V0QXR0cmlidXRlKFwiYWx0XCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikrXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgKGxhYmVsLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYoY3VyLCBsYWJlbC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgbGFiZWwsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWwudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgICAgIGlmKCAoPEVsZW1lbnQ+Y3VyKS5xdWVyeVNlbGVjdG9yKFwibGVnZW5kXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZ2VuZCA9ICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWdlbmQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBjdXIsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZS5cbiAgICAgICAgaWYgKCh3YWxrVHJhdmVyc2UgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSAmJiBpc0VtYmVkZGVkQ29udHJvbCkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgdGV4dGJveCwgcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRleHRib3hcIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa1RyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSBidXR0b24sIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgYnV0dG9uLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJ1dHRvblwiLCBcInN1Ym1pdFwiLCBcInJlc2V0XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJzdWJtaXRcIikgcmV0dXJuIFwiU3VibWl0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZXNldFwiKSByZXR1cm4gXCJSZXNldFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa1RyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSBjb21ib2JveCBvciBsaXN0Ym94LCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW0sIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBzZWxlY3RlZCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGVtYmVkZGVkIGNvbnRyb2wgaGFzIHJvbGUgcmFuZ2UgKGUuZy4sIGEgc3BpbmJ1dHRvbiBvciBzbGlkZXIpOlxuICAgICAgICAgICAgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiXS5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKSkgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBPdGhlcndpc2UsIHVzZSB0aGUgdmFsdWUgYXMgc3BlY2lmaWVkIGJ5IGEgaG9zdCBsYW5ndWFnZSBhdHRyaWJ1dGUuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZi4gMmguXG4gICAgICAgIGlmICh3YWxrVHJhdmVyc2UgfHwgQVJJQURlZmluaXRpb25zLm5hbWVGcm9tQ29udGVudChyb2xlKSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpIHtcbiAgICAgICAgICAgIC8vIDJmaS4gU2V0IHRoZSBhY2N1bXVsYXRlZCB0ZXh0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICAgICAgICBsZXQgYWNjdW11bGF0ZWQgPSBcIlwiO1xuICAgICAgICAgICAgLy8gMmZpaS4gQ2hlY2sgZm9yIENTUyBnZW5lcmF0ZWQgdGV4dHVhbCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlIGFuZCBcbiAgICAgICAgICAgIC8vIGluY2x1ZGUgaXQgaW4gdGhlIGFjY3VtdWxhdGVkIHRleHQuIFRoZSBDU1MgOmJlZm9yZSBhbmQgOmFmdGVyIHBzZXVkbyBlbGVtZW50cyBbQ1NTMl0gXG4gICAgICAgICAgICAvLyBjYW4gcHJvdmlkZSB0ZXh0dWFsIGNvbnRlbnQgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGNvbnRlbnQgbW9kZWwuXG4gICAgICAgICAgICAvLyAgIEZvciA6YmVmb3JlIHBzZXVkbyBlbGVtZW50cywgVXNlciBhZ2VudHMgTVVTVCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgXG4gICAgICAgICAgICAvLyAgICAgYSBzcGFjZSwgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgICAgLy8gICBGb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgVXNlciBhZ2VudHMgTVVTVCBhcHBlbmQgQ1NTIHRleHR1YWwgY29udGVudCwgd2l0aG91dCBhIFxuICAgICAgICAgICAgLy8gICAgIHNwYWNlLCB0byB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gbnVsbDtcbiAgICAgICAgICAgIGJlZm9yZSA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sXCJiZWZvcmVcIikuY29udGVudDtcblxuICAgICAgICAgICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlID0gYmVmb3JlLnJlcGxhY2UoL15cIi8sXCJcIikucmVwbGFjZSgvXCIkLyxcIlwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBiZWZvcmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyZmlpaS4gRm9yIGVhY2ggY2hpbGQgbm9kZSBvZiB0aGUgY3VycmVudCBub2RlOlxuICAgICAgICAgICAgLy8gICBTZXQgdGhlIGN1cnJlbnQgbm9kZSB0byB0aGUgY2hpbGQgbm9kZS5cbiAgICAgICAgICAgIC8vICAgQ29tcHV0ZSB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY3VycmVudCBub2RlIGJlZ2lubmluZyB3aXRoIHN0ZXAgMi4gU2V0IHRoZSByZXN1bHQgXG4gICAgICAgICAgICAvLyAgICAgdG8gdGhhdCB0ZXh0IGFsdGVybmF0aXZlLlxuICAgICAgICAgICAgLy8gICBBcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgYWNjdW11bGF0ZWQgdGV4dC5cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0xPVFwiKSB7XG4gICAgICAgICAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lclRleHQgJiYgaW5uZXJUZXh0ICE9PSBudWxsICYmIGlubmVyVGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9ICBcIiBcIiArIGlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RDaGlsZCBvZiAoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGlsZENvbnRlbnQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHNsb3RDaGlsZCwgbGFiZWxsZWRieVRyYXZlcnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgbmV4dENoaWxkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHdhbGtDaGlsZCA9IGVsZW0uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hpbGRDb250ZW50ID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCB3YWxrQ2hpbGQsIGxhYmVsbGVkYnlUcmF2ZXJzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IFwiIFwiICsgbmV4dENoaWxkQ29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkID0gd2Fsa0NoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFmdGVyID0gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYWZ0ZXIgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLFwiYWZ0ZXJcIikuY29udGVudDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgICAgIGlmIChhZnRlciAmJiBhZnRlciAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGFmdGVyLnJlcGxhY2UoL15cIi8sXCJcIikucmVwbGFjZSgvXCIkLyxcIlwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZCArPSBhZnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDJmaXYuIFJldHVybiB0aGUgYWNjdW11bGF0ZWQgdGV4dC5cbiAgICAgICAgICAgIGFjY3VtdWxhdGVkID0gYWNjdW11bGF0ZWQucmVwbGFjZSgvXFxzKy9nLFwiIFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyaS4gT3RoZXJ3aXNlLCBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBhIFRvb2x0aXAgYXR0cmlidXRlLCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aXRsZS50ZXh0Q29udGVudCB8fCB0aXRsZS5pbm5lclRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgKi9cbi8qICAgICAgICBpZiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbSBcbiAgICAgICAgICAgICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSBcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0ub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibGFiZWxbZm9yPSdcIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKStcIiddXCIpLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICAgICAgbmFtZSArPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtLCBpZCkudGV4dENvbnRlbnQgKyBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9Ki9cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9kZVRvUm9sZShub2RlIDogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIFwidGV4dFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPIERPOiB1c2UgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pIHRvIHJlcGxhY2UgdGhlIGNvZGUgZm9sbG93aW5nLCB3aGljaCB1c2VzIG9ubHkgdGhlIHZhbGlkIHJvbGVzIGZvciB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgYXJpYSBmYWxsYmFjayBydWxlXG4gICAgICAgIC8vY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLy9yZXR1cm4gcm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIiA/IG51bGwgOiByb2xlO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByb2xlU3RyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGxldCByb2xlcyA9IHJvbGVTdHIuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZWxlbWVudCBpcyBmb2N1c2FibGUsIHRoZW4gcHJlc2VudGF0aW9uIHJvbGVzIGFyZSB0byBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gdGhpcy5lbGVtVG9JbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW0pO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwibm9kZT1cIiArIG5vZGUubm9kZU5hbWUgK1wiLCByb2xlPSBcIiArIChyb2xlcyA/IHJvbGVzWzBdIDogbnVsbCkgK1wiLCByZXNvbHZlZD1cIiArIEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKSk7XG4gICAgICAgIGNvbnN0IHJvbGUgPSAhcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTAgPyBudWxsIDogcm9sZXNbMF07XG4gICAgICAgIHJldHVybiByb2xlID09PSBcInByZXNlbnRhdGlvblwiIHx8IHJvbGUgPT09IFwibm9uZVwiID8gbnVsbCA6IHJvbGU7XG4gICAgICAgIC8vcmV0dXJuIEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgXG4gICAgfVxufSBcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5cbi8qKlxuICogV2Fsa3MgaW4gYW4gQVJJQSBvcmRlclxuICogXG4gKiBTZWUgYWxzbyAuLi9kb20vRE9NV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBBUklBV2Fsa2VyIHtcbiAgICByb290IDogTm9kZTtcbiAgICBub2RlIDogTm9kZTtcbiAgICBiRW5kVGFnOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCA6IE5vZGUsIGJFbmQ/IDogYm9vbGVhbiwgcm9vdD8gOiBOb2RlKSB7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3QgfHwgZWxlbWVudDtcbiAgICAgICAgaWYgKHRoaXMucm9vdC5ub2RlVHlwZSA9PT0gOSkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gKHRoaXMucm9vdCBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudDtcbiAgICAgICAgLy8gaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gOSkge1xuICAgICAgICAvLyAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBEb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5iRW5kVGFnID0gKGJFbmQgPT0gdW5kZWZpbmVkID8gZmFsc2UgOiBiRW5kID09IHRydWUpO1xuICAgIH1cblxuICAgIGF0Um9vdCgpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICgodGhpcyBhcyBhbnkpLm93bmVyRWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yb290ID09PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmlzU2FtZU5vZGUodGhpcy5ub2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5ub2RlKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wYXJlbnROb2RlID09PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dE5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBET01XYWxrZXIuYXNzaWduU2xvdHModGhpcy5ub2RlIGFzIFNoYWRvd1Jvb3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKClbMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5maXJzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4KzE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTbG90SW5kZXggPCBzbG90T3duZXIuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtuZXh0U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcE93bmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bklkcyA9ICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgfHwgISh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gb3duSWRzLmluZGV4T2YoKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IG93bklkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhc3Qgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlOyAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYWIgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1tpZHgrMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICAgICAgfHwgKHNraXBPd25lZCAmJiB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgISFBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5sYXN0Q2hpbGQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSkgXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBza2lwT3duZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duSWRzID0gKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSB8fCAhKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBvd25JZHMuaW5kZXhPZigodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gb3duSWRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lkeCsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoXG4gICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEpXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICB8fCAoc2tpcE93bmVkICYmIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhIUFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vLi4vLi4vYXBpL0lFbmdpbmVcIjtcblxuZXhwb3J0IGNsYXNzIEFuY2VzdG9yVXRpbCB7XG4gICAgcHVibGljIHN0YXRpYyBpc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaHk6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGV4dEhpZXJhcmNoeSAmJiBjb250ZXh0SGllcmFyY2h5LmRvbSkge1xuICAgICAgICAgICAgLy8gU2tpcCBjdXJyZW50IG5vZGUgYmVjYXVzZSB3ZSB3YW50IGFuY2VzdHJ5XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9Y29udGV4dEhpZXJhcmNoeS5kb20ubGVuZ3RoLTI7IGlkeCA+PSAwOyAtLWlkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoY29udGV4dEhpZXJhcmNoeS5kb21baWR4XS5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlmcmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0ZyYW1lKGNvbnRleHRIaWVyYXJjaHk6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGV4dEhpZXJhcmNoeSAmJiBjb250ZXh0SGllcmFyY2h5LmRvbSkge1xuICAgICAgICAgICAgLy8gU2tpcCBjdXJyZW50IG5vZGUgYmVjYXVzZSB3ZSB3YW50IGFuY2VzdHJ5XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9Y29udGV4dEhpZXJhcmNoeS5kb20ubGVuZ3RoLTI7IGlkeCA+PSAwOyAtLWlkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoY29udGV4dEhpZXJhcmNoeS5kb21baWR4XS5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi8uLi8uLi9hcGkvSUVuZ2luZVwiO1xuXG5leHBvcnQgY2xhc3MgRnJhZ21lbnRVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGdldE93bmVyRnJhZ21lbnQobm9kZTogTm9kZSkgOiBEb2N1bWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgICAgICBsZXQgbiA6IE5vZGUgPSBub2RlO1xuICAgICAgICB3aGlsZShuLnBhcmVudE5vZGUgJiYgKG4gPSBuLnBhcmVudE5vZGUpKXtcbiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGUub3duZXJEb2N1bWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEJ5SWQobm9kZTogTm9kZSwgaWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPd25lckZyYWdtZW50KG5vZGUpLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yKGhpZXJhcmNoaWVzOiBSdWxlQ29udGV4dEhpZXJhcmNoeSwgZWxlbU5hbWU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGhpZXJhcmNoaWVzW1wiZG9tXCJdLmZpbHRlcihpbmZvID0+IGluZm8ucm9sZSA9PT0gZWxlbU5hbWUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNbMF0ubm9kZSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3JXaXRoUm9sZShoaWVyYXJjaGllczogUnVsZUNvbnRleHRIaWVyYXJjaHksIHJvbGU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaW5mbyA9PiBpbmZvLnJvbGUgPT09IHJvbGUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcy5sZW5ndGggPiAwICYmIG1hdGNoZXNbMF0ubm9kZSB8fCBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjEtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIEZyb20gaHR0cHM6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5L2xhbmd1YWdlLXN1YnRhZy1yZWdpc3RyeVxuY29uc3QgdmFsaWRQcmltYXJ5TGFuZ3MgPSBbIC8vIFwicWFhLi5xdHpcIixcblsgXCJhYVwiLFwiYWJcIixcImFlXCIsXCJhZlwiLFwiYWtcIixcImFtXCIsXCJhblwiLFwiYXJcIixcImFzXCIsXCJhdlwiLFwiYXlcIixcImF6XCIsXCJhYWFcIixcImFhYlwiLFwiYWFjXCIsXCJhYWRcIixcImFhZVwiLFwiYWFmXCIsXCJhYWdcIixcImFhaFwiLFwiYWFpXCIsXCJhYWtcIixcImFhbFwiLFwiYWFtXCIsXCJhYW5cIixcImFhb1wiLFwiYWFwXCIsXCJhYXFcIixcImFhc1wiLFwiYWF0XCIsXCJhYXVcIixcImFhdlwiLFwiYWF3XCIsXCJhYXhcIixcImFhelwiLFwiYWJhXCIsXCJhYmJcIixcImFiY1wiLFwiYWJkXCIsXCJhYmVcIixcImFiZlwiLFwiYWJnXCIsXCJhYmhcIixcImFiaVwiLFwiYWJqXCIsXCJhYmxcIixcImFibVwiLFwiYWJuXCIsXCJhYm9cIixcImFicFwiLFwiYWJxXCIsXCJhYnJcIixcImFic1wiLFwiYWJ0XCIsXCJhYnVcIixcImFidlwiLFwiYWJ3XCIsXCJhYnhcIixcImFieVwiLFwiYWJ6XCIsXCJhY2FcIixcImFjYlwiLFwiYWNkXCIsXCJhY2VcIixcImFjZlwiLFwiYWNoXCIsXCJhY2lcIixcImFja1wiLFwiYWNsXCIsXCJhY21cIixcImFjblwiLFwiYWNwXCIsXCJhY3FcIixcImFjclwiLFwiYWNzXCIsXCJhY3RcIixcImFjdVwiLFwiYWN2XCIsXCJhY3dcIixcImFjeFwiLFwiYWN5XCIsXCJhY3pcIixcImFkYVwiLFwiYWRiXCIsXCJhZGRcIixcImFkZVwiLFwiYWRmXCIsXCJhZGdcIixcImFkaFwiLFwiYWRpXCIsXCJhZGpcIixcImFkbFwiLFwiYWRuXCIsXCJhZG9cIixcImFkcFwiLFwiYWRxXCIsXCJhZHJcIixcImFkc1wiLFwiYWR0XCIsXCJhZHVcIixcImFkd1wiLFwiYWR4XCIsXCJhZHlcIixcImFkelwiLFwiYWVhXCIsXCJhZWJcIixcImFlY1wiLFwiYWVkXCIsXCJhZWVcIixcImFla1wiLFwiYWVsXCIsXCJhZW1cIixcImFlblwiLFwiYWVxXCIsXCJhZXJcIixcImFlc1wiLFwiYWV1XCIsXCJhZXdcIixcImFleVwiLFwiYWV6XCIsXCJhZmFcIixcImFmYlwiLFwiYWZkXCIsXCJhZmVcIixcImFmZ1wiLFwiYWZoXCIsXCJhZmlcIixcImFma1wiLFwiYWZuXCIsXCJhZm9cIixcImFmcFwiLFwiYWZzXCIsXCJhZnRcIixcImFmdVwiLFwiYWZ6XCIsXCJhZ2FcIixcImFnYlwiLFwiYWdjXCIsXCJhZ2RcIixcImFnZVwiLFwiYWdmXCIsXCJhZ2dcIixcImFnaFwiLFwiYWdpXCIsXCJhZ2pcIixcImFna1wiLFwiYWdsXCIsXCJhZ21cIixcImFnblwiLFwiYWdvXCIsXCJhZ3BcIixcImFncVwiLFwiYWdyXCIsXCJhZ3NcIixcImFndFwiLFwiYWd1XCIsXCJhZ3ZcIixcImFnd1wiLFwiYWd4XCIsXCJhZ3lcIixcImFnelwiLFwiYWhhXCIsXCJhaGJcIixcImFoZ1wiLFwiYWhoXCIsXCJhaGlcIixcImFoa1wiLFwiYWhsXCIsXCJhaG1cIixcImFoblwiLFwiYWhvXCIsXCJhaHBcIixcImFoclwiLFwiYWhzXCIsXCJhaHRcIixcImFpYVwiLFwiYWliXCIsXCJhaWNcIixcImFpZFwiLFwiYWllXCIsXCJhaWZcIixcImFpZ1wiLFwiYWloXCIsXCJhaWlcIixcImFpalwiLFwiYWlrXCIsXCJhaWxcIixcImFpbVwiLFwiYWluXCIsXCJhaW9cIixcImFpcFwiLFwiYWlxXCIsXCJhaXJcIixcImFpc1wiLFwiYWl0XCIsXCJhaXdcIixcImFpeFwiLFwiYWl5XCIsXCJhamFcIixcImFqZ1wiLFwiYWppXCIsXCJham5cIixcImFqcFwiLFwiYWp0XCIsXCJhanVcIixcImFqd1wiLFwiYWp6XCIsXCJha2JcIixcImFrY1wiLFwiYWtkXCIsXCJha2VcIixcImFrZlwiLFwiYWtnXCIsXCJha2hcIixcImFraVwiLFwiYWtqXCIsXCJha2tcIixcImFrbFwiLFwiYWttXCIsXCJha29cIixcImFrcFwiLFwiYWtxXCIsXCJha3JcIixcImFrc1wiLFwiYWt0XCIsXCJha3VcIixcImFrdlwiLFwiYWt3XCIsXCJha3hcIixcImFreVwiLFwiYWt6XCIsXCJhbGFcIixcImFsY1wiLFwiYWxkXCIsXCJhbGVcIixcImFsZlwiLFwiYWxnXCIsXCJhbGhcIixcImFsaVwiLFwiYWxqXCIsXCJhbGtcIixcImFsbFwiLFwiYWxtXCIsXCJhbG5cIixcImFsb1wiLFwiYWxwXCIsXCJhbHFcIixcImFsclwiLFwiYWxzXCIsXCJhbHRcIixcImFsdVwiLFwiYWx2XCIsXCJhbHdcIixcImFseFwiLFwiYWx5XCIsXCJhbHpcIixcImFtYVwiLFwiYW1iXCIsXCJhbWNcIixcImFtZVwiLFwiYW1mXCIsXCJhbWdcIixcImFtaVwiLFwiYW1qXCIsXCJhbWtcIixcImFtbFwiLFwiYW1tXCIsXCJhbW5cIixcImFtb1wiLFwiYW1wXCIsXCJhbXFcIixcImFtclwiLFwiYW1zXCIsXCJhbXRcIixcImFtdVwiLFwiYW12XCIsXCJhbXdcIixcImFteFwiLFwiYW15XCIsXCJhbXpcIixcImFuYVwiLFwiYW5iXCIsXCJhbmNcIixcImFuZFwiLFwiYW5lXCIsXCJhbmZcIixcImFuZ1wiLFwiYW5oXCIsXCJhbmlcIixcImFualwiLFwiYW5rXCIsXCJhbmxcIixcImFubVwiLFwiYW5uXCIsXCJhbm9cIixcImFucFwiLFwiYW5xXCIsXCJhbnJcIixcImFuc1wiLFwiYW50XCIsXCJhbnVcIixcImFudlwiLFwiYW53XCIsXCJhbnhcIixcImFueVwiLFwiYW56XCIsXCJhb2FcIixcImFvYlwiLFwiYW9jXCIsXCJhb2RcIixcImFvZVwiLFwiYW9mXCIsXCJhb2dcIixcImFvaFwiLFwiYW9pXCIsXCJhb2pcIixcImFva1wiLFwiYW9sXCIsXCJhb21cIixcImFvblwiLFwiYW9yXCIsXCJhb3NcIixcImFvdFwiLFwiYW91XCIsXCJhb3hcIixcImFvelwiLFwiYXBhXCIsXCJhcGJcIixcImFwY1wiLFwiYXBkXCIsXCJhcGVcIixcImFwZlwiLFwiYXBnXCIsXCJhcGhcIixcImFwaVwiLFwiYXBqXCIsXCJhcGtcIixcImFwbFwiLFwiYXBtXCIsXCJhcG5cIixcImFwb1wiLFwiYXBwXCIsXCJhcHFcIixcImFwclwiLFwiYXBzXCIsXCJhcHRcIixcImFwdVwiLFwiYXB2XCIsXCJhcHdcIixcImFweFwiLFwiYXB5XCIsXCJhcHpcIixcImFxYVwiLFwiYXFjXCIsXCJhcWRcIixcImFxZ1wiLFwiYXFrXCIsXCJhcWxcIixcImFxbVwiLFwiYXFuXCIsXCJhcXBcIixcImFxclwiLFwiYXF0XCIsXCJhcXpcIixcImFyYlwiLFwiYXJjXCIsXCJhcmRcIixcImFyZVwiLFwiYXJoXCIsXCJhcmlcIixcImFyalwiLFwiYXJrXCIsXCJhcmxcIixcImFyblwiLFwiYXJvXCIsXCJhcnBcIixcImFycVwiLFwiYXJyXCIsXCJhcnNcIixcImFydFwiLFwiYXJ1XCIsXCJhcnZcIixcImFyd1wiLFwiYXJ4XCIsXCJhcnlcIixcImFyelwiLFwiYXNhXCIsXCJhc2JcIixcImFzY1wiLFwiYXNkXCIsXCJhc2VcIixcImFzZlwiLFwiYXNnXCIsXCJhc2hcIixcImFzaVwiLFwiYXNqXCIsXCJhc2tcIixcImFzbFwiLFwiYXNuXCIsXCJhc29cIixcImFzcFwiLFwiYXNxXCIsXCJhc3JcIixcImFzc1wiLFwiYXN0XCIsXCJhc3VcIixcImFzdlwiLFwiYXN3XCIsXCJhc3hcIixcImFzeVwiLFwiYXN6XCIsXCJhdGFcIixcImF0YlwiLFwiYXRjXCIsXCJhdGRcIixcImF0ZVwiLFwiYXRnXCIsXCJhdGhcIixcImF0aVwiLFwiYXRqXCIsXCJhdGtcIixcImF0bFwiLFwiYXRtXCIsXCJhdG5cIixcImF0b1wiLFwiYXRwXCIsXCJhdHFcIixcImF0clwiLFwiYXRzXCIsXCJhdHRcIixcImF0dVwiLFwiYXR2XCIsXCJhdHdcIixcImF0eFwiLFwiYXR5XCIsXCJhdHpcIixcImF1YVwiLFwiYXViXCIsXCJhdWNcIixcImF1ZFwiLFwiYXVlXCIsXCJhdWZcIixcImF1Z1wiLFwiYXVoXCIsXCJhdWlcIixcImF1alwiLFwiYXVrXCIsXCJhdWxcIixcImF1bVwiLFwiYXVuXCIsXCJhdW9cIixcImF1cFwiLFwiYXVxXCIsXCJhdXJcIixcImF1c1wiLFwiYXV0XCIsXCJhdXVcIixcImF1d1wiLFwiYXV4XCIsXCJhdXlcIixcImF1elwiLFwiYXZiXCIsXCJhdmRcIixcImF2aVwiLFwiYXZrXCIsXCJhdmxcIixcImF2bVwiLFwiYXZuXCIsXCJhdm9cIixcImF2c1wiLFwiYXZ0XCIsXCJhdnVcIixcImF2dlwiLFwiYXdhXCIsXCJhd2JcIixcImF3Y1wiLFwiYXdkXCIsXCJhd2VcIixcImF3Z1wiLFwiYXdoXCIsXCJhd2lcIixcImF3a1wiLFwiYXdtXCIsXCJhd25cIixcImF3b1wiLFwiYXdyXCIsXCJhd3NcIixcImF3dFwiLFwiYXd1XCIsXCJhd3ZcIixcImF3d1wiLFwiYXd4XCIsXCJhd3lcIixcImF4YlwiLFwiYXhlXCIsXCJheGdcIixcImF4a1wiLFwiYXhsXCIsXCJheG1cIixcImF4eFwiLFwiYXlhXCIsXCJheWJcIixcImF5Y1wiLFwiYXlkXCIsXCJheWVcIixcImF5Z1wiLFwiYXloXCIsXCJheWlcIixcImF5a1wiLFwiYXlsXCIsXCJheW5cIixcImF5b1wiLFwiYXlwXCIsXCJheXFcIixcImF5clwiLFwiYXlzXCIsXCJheXRcIixcImF5dVwiLFwiYXl4XCIsXCJheXlcIixcImF5elwiLFwiYXphXCIsXCJhemJcIixcImF6Y1wiLFwiYXpkXCIsXCJhemdcIixcImF6alwiLFwiYXptXCIsXCJhem5cIixcImF6b1wiLFwiYXp0XCIsXCJhenpcIl1cbixbIFwiYmFcIixcImJlXCIsXCJiZ1wiLFwiYmhcIixcImJpXCIsXCJibVwiLFwiYm5cIixcImJvXCIsXCJiclwiLFwiYnNcIixcImJhYVwiLFwiYmFiXCIsXCJiYWNcIixcImJhZFwiLFwiYmFlXCIsXCJiYWZcIixcImJhZ1wiLFwiYmFoXCIsXCJiYWlcIixcImJhalwiLFwiYmFsXCIsXCJiYW5cIixcImJhb1wiLFwiYmFwXCIsXCJiYXJcIixcImJhc1wiLFwiYmF0XCIsXCJiYXVcIixcImJhdlwiLFwiYmF3XCIsXCJiYXhcIixcImJheVwiLFwiYmF6XCIsXCJiYmFcIixcImJiYlwiLFwiYmJjXCIsXCJiYmRcIixcImJiZVwiLFwiYmJmXCIsXCJiYmdcIixcImJiaFwiLFwiYmJpXCIsXCJiYmpcIixcImJia1wiLFwiYmJsXCIsXCJiYm1cIixcImJiblwiLFwiYmJvXCIsXCJiYnBcIixcImJicVwiLFwiYmJyXCIsXCJiYnNcIixcImJidFwiLFwiYmJ1XCIsXCJiYnZcIixcImJid1wiLFwiYmJ4XCIsXCJiYnlcIixcImJielwiLFwiYmNhXCIsXCJiY2JcIixcImJjY1wiLFwiYmNkXCIsXCJiY2VcIixcImJjZlwiLFwiYmNnXCIsXCJiY2hcIixcImJjaVwiLFwiYmNqXCIsXCJiY2tcIixcImJjbFwiLFwiYmNtXCIsXCJiY25cIixcImJjb1wiLFwiYmNwXCIsXCJiY3FcIixcImJjclwiLFwiYmNzXCIsXCJiY3RcIixcImJjdVwiLFwiYmN2XCIsXCJiY3dcIixcImJjeVwiLFwiYmN6XCIsXCJiZGFcIixcImJkYlwiLFwiYmRjXCIsXCJiZGRcIixcImJkZVwiLFwiYmRmXCIsXCJiZGdcIixcImJkaFwiLFwiYmRpXCIsXCJiZGpcIixcImJka1wiLFwiYmRsXCIsXCJiZG1cIixcImJkblwiLFwiYmRvXCIsXCJiZHBcIixcImJkcVwiLFwiYmRyXCIsXCJiZHNcIixcImJkdFwiLFwiYmR1XCIsXCJiZHZcIixcImJkd1wiLFwiYmR4XCIsXCJiZHlcIixcImJkelwiLFwiYmVhXCIsXCJiZWJcIixcImJlY1wiLFwiYmVkXCIsXCJiZWVcIixcImJlZlwiLFwiYmVnXCIsXCJiZWhcIixcImJlaVwiLFwiYmVqXCIsXCJiZWtcIixcImJlbVwiLFwiYmVvXCIsXCJiZXBcIixcImJlcVwiLFwiYmVyXCIsXCJiZXNcIixcImJldFwiLFwiYmV1XCIsXCJiZXZcIixcImJld1wiLFwiYmV4XCIsXCJiZXlcIixcImJlelwiLFwiYmZhXCIsXCJiZmJcIixcImJmY1wiLFwiYmZkXCIsXCJiZmVcIixcImJmZlwiLFwiYmZnXCIsXCJiZmhcIixcImJmaVwiLFwiYmZqXCIsXCJiZmtcIixcImJmbFwiLFwiYmZtXCIsXCJiZm5cIixcImJmb1wiLFwiYmZwXCIsXCJiZnFcIixcImJmclwiLFwiYmZzXCIsXCJiZnRcIixcImJmdVwiLFwiYmZ3XCIsXCJiZnhcIixcImJmeVwiLFwiYmZ6XCIsXCJiZ2FcIixcImJnYlwiLFwiYmdjXCIsXCJiZ2RcIixcImJnZVwiLFwiYmdmXCIsXCJiZ2dcIixcImJnaVwiLFwiYmdqXCIsXCJiZ2tcIixcImJnbFwiLFwiYmdtXCIsXCJiZ25cIixcImJnb1wiLFwiYmdwXCIsXCJiZ3FcIixcImJnclwiLFwiYmdzXCIsXCJiZ3RcIixcImJndVwiLFwiYmd2XCIsXCJiZ3dcIixcImJneFwiLFwiYmd5XCIsXCJiZ3pcIixcImJoYVwiLFwiYmhiXCIsXCJiaGNcIixcImJoZFwiLFwiYmhlXCIsXCJiaGZcIixcImJoZ1wiLFwiYmhoXCIsXCJiaGlcIixcImJoalwiLFwiYmhrXCIsXCJiaGxcIixcImJobVwiLFwiYmhuXCIsXCJiaG9cIixcImJocFwiLFwiYmhxXCIsXCJiaHJcIixcImJoc1wiLFwiYmh0XCIsXCJiaHVcIixcImJodlwiLFwiYmh3XCIsXCJiaHhcIixcImJoeVwiLFwiYmh6XCIsXCJiaWFcIixcImJpYlwiLFwiYmljXCIsXCJiaWRcIixcImJpZVwiLFwiYmlmXCIsXCJiaWdcIixcImJpalwiLFwiYmlrXCIsXCJiaWxcIixcImJpbVwiLFwiYmluXCIsXCJiaW9cIixcImJpcFwiLFwiYmlxXCIsXCJiaXJcIixcImJpdFwiLFwiYml1XCIsXCJiaXZcIixcImJpd1wiLFwiYml4XCIsXCJiaXlcIixcImJpelwiLFwiYmphXCIsXCJiamJcIixcImJqY1wiLFwiYmpkXCIsXCJiamVcIixcImJqZlwiLFwiYmpnXCIsXCJiamhcIixcImJqaVwiLFwiYmpqXCIsXCJiamtcIixcImJqbFwiLFwiYmptXCIsXCJiam5cIixcImJqb1wiLFwiYmpwXCIsXCJianFcIixcImJqclwiLFwiYmpzXCIsXCJianRcIixcImJqdVwiLFwiYmp2XCIsXCJiandcIixcImJqeFwiLFwiYmp5XCIsXCJianpcIixcImJrYVwiLFwiYmtiXCIsXCJia2NcIixcImJrZFwiLFwiYmtmXCIsXCJia2dcIixcImJraFwiLFwiYmtpXCIsXCJia2pcIixcImJra1wiLFwiYmtsXCIsXCJia21cIixcImJrblwiLFwiYmtvXCIsXCJia3BcIixcImJrcVwiLFwiYmtyXCIsXCJia3NcIixcImJrdFwiLFwiYmt1XCIsXCJia3ZcIixcImJrd1wiLFwiYmt4XCIsXCJia3lcIixcImJrelwiLFwiYmxhXCIsXCJibGJcIixcImJsY1wiLFwiYmxkXCIsXCJibGVcIixcImJsZlwiLFwiYmxnXCIsXCJibGhcIixcImJsaVwiLFwiYmxqXCIsXCJibGtcIixcImJsbFwiLFwiYmxtXCIsXCJibG5cIixcImJsb1wiLFwiYmxwXCIsXCJibHFcIixcImJsclwiLFwiYmxzXCIsXCJibHRcIixcImJsdlwiLFwiYmx3XCIsXCJibHhcIixcImJseVwiLFwiYmx6XCIsXCJibWFcIixcImJtYlwiLFwiYm1jXCIsXCJibWRcIixcImJtZVwiLFwiYm1mXCIsXCJibWdcIixcImJtaFwiLFwiYm1pXCIsXCJibWpcIixcImJta1wiLFwiYm1sXCIsXCJibW1cIixcImJtblwiLFwiYm1vXCIsXCJibXBcIixcImJtcVwiLFwiYm1yXCIsXCJibXNcIixcImJtdFwiLFwiYm11XCIsXCJibXZcIixcImJtd1wiLFwiYm14XCIsXCJibXlcIixcImJtelwiLFwiYm5hXCIsXCJibmJcIixcImJuY1wiLFwiYm5kXCIsXCJibmVcIixcImJuZlwiLFwiYm5nXCIsXCJibmlcIixcImJualwiLFwiYm5rXCIsXCJibmxcIixcImJubVwiLFwiYm5uXCIsXCJibm9cIixcImJucFwiLFwiYm5xXCIsXCJibnJcIixcImJuc1wiLFwiYm50XCIsXCJibnVcIixcImJudlwiLFwiYm53XCIsXCJibnhcIixcImJueVwiLFwiYm56XCIsXCJib2FcIixcImJvYlwiLFwiYm9lXCIsXCJib2ZcIixcImJvZ1wiLFwiYm9oXCIsXCJib2lcIixcImJvalwiLFwiYm9rXCIsXCJib2xcIixcImJvbVwiLFwiYm9uXCIsXCJib29cIixcImJvcFwiLFwiYm9xXCIsXCJib3JcIixcImJvdFwiLFwiYm91XCIsXCJib3ZcIixcImJvd1wiLFwiYm94XCIsXCJib3lcIixcImJvelwiLFwiYnBhXCIsXCJicGJcIixcImJwZFwiLFwiYnBlXCIsXCJicGdcIixcImJwaFwiLFwiYnBpXCIsXCJicGpcIixcImJwa1wiLFwiYnBsXCIsXCJicG1cIixcImJwblwiLFwiYnBvXCIsXCJicHBcIixcImJwcVwiLFwiYnByXCIsXCJicHNcIixcImJwdFwiLFwiYnB1XCIsXCJicHZcIixcImJwd1wiLFwiYnB4XCIsXCJicHlcIixcImJwelwiLFwiYnFhXCIsXCJicWJcIixcImJxY1wiLFwiYnFkXCIsXCJicWZcIixcImJxZ1wiLFwiYnFoXCIsXCJicWlcIixcImJxalwiLFwiYnFrXCIsXCJicWxcIixcImJxbVwiLFwiYnFuXCIsXCJicW9cIixcImJxcFwiLFwiYnFxXCIsXCJicXJcIixcImJxc1wiLFwiYnF0XCIsXCJicXVcIixcImJxdlwiLFwiYnF3XCIsXCJicXhcIixcImJxeVwiLFwiYnF6XCIsXCJicmFcIixcImJyYlwiLFwiYnJjXCIsXCJicmRcIixcImJyZlwiLFwiYnJnXCIsXCJicmhcIixcImJyaVwiLFwiYnJqXCIsXCJicmtcIixcImJybFwiLFwiYnJtXCIsXCJicm5cIixcImJyb1wiLFwiYnJwXCIsXCJicnFcIixcImJyclwiLFwiYnJzXCIsXCJicnRcIixcImJydVwiLFwiYnJ2XCIsXCJicndcIixcImJyeFwiLFwiYnJ5XCIsXCJicnpcIixcImJzYVwiLFwiYnNiXCIsXCJic2NcIixcImJzZVwiLFwiYnNmXCIsXCJic2dcIixcImJzaFwiLFwiYnNpXCIsXCJic2pcIixcImJza1wiLFwiYnNsXCIsXCJic21cIixcImJzblwiLFwiYnNvXCIsXCJic3BcIixcImJzcVwiLFwiYnNyXCIsXCJic3NcIixcImJzdFwiLFwiYnN1XCIsXCJic3ZcIixcImJzd1wiLFwiYnN4XCIsXCJic3lcIixcImJ0YVwiLFwiYnRiXCIsXCJidGNcIixcImJ0ZFwiLFwiYnRlXCIsXCJidGZcIixcImJ0Z1wiLFwiYnRoXCIsXCJidGlcIixcImJ0alwiLFwiYnRrXCIsXCJidGxcIixcImJ0bVwiLFwiYnRuXCIsXCJidG9cIixcImJ0cFwiLFwiYnRxXCIsXCJidHJcIixcImJ0c1wiLFwiYnR0XCIsXCJidHVcIixcImJ0dlwiLFwiYnR3XCIsXCJidHhcIixcImJ0eVwiLFwiYnR6XCIsXCJidWFcIixcImJ1YlwiLFwiYnVjXCIsXCJidWRcIixcImJ1ZVwiLFwiYnVmXCIsXCJidWdcIixcImJ1aFwiLFwiYnVpXCIsXCJidWpcIixcImJ1a1wiLFwiYnVtXCIsXCJidW5cIixcImJ1b1wiLFwiYnVwXCIsXCJidXFcIixcImJ1c1wiLFwiYnV0XCIsXCJidXVcIixcImJ1dlwiLFwiYnV3XCIsXCJidXhcIixcImJ1eVwiLFwiYnV6XCIsXCJidmFcIixcImJ2YlwiLFwiYnZjXCIsXCJidmRcIixcImJ2ZVwiLFwiYnZmXCIsXCJidmdcIixcImJ2aFwiLFwiYnZpXCIsXCJidmpcIixcImJ2a1wiLFwiYnZsXCIsXCJidm1cIixcImJ2blwiLFwiYnZvXCIsXCJidnBcIixcImJ2cVwiLFwiYnZyXCIsXCJidnRcIixcImJ2dVwiLFwiYnZ2XCIsXCJidndcIixcImJ2eFwiLFwiYnZ5XCIsXCJidnpcIixcImJ3YVwiLFwiYndiXCIsXCJid2NcIixcImJ3ZFwiLFwiYndlXCIsXCJid2ZcIixcImJ3Z1wiLFwiYndoXCIsXCJid2lcIixcImJ3alwiLFwiYndrXCIsXCJid2xcIixcImJ3bVwiLFwiYnduXCIsXCJid29cIixcImJ3cFwiLFwiYndxXCIsXCJid3JcIixcImJ3c1wiLFwiYnd0XCIsXCJid3VcIixcImJ3d1wiLFwiYnd4XCIsXCJid3lcIixcImJ3elwiLFwiYnhhXCIsXCJieGJcIixcImJ4Y1wiLFwiYnhkXCIsXCJieGVcIixcImJ4ZlwiLFwiYnhnXCIsXCJieGhcIixcImJ4aVwiLFwiYnhqXCIsXCJieGtcIixcImJ4bFwiLFwiYnhtXCIsXCJieG5cIixcImJ4b1wiLFwiYnhwXCIsXCJieHFcIixcImJ4clwiLFwiYnhzXCIsXCJieHVcIixcImJ4dlwiLFwiYnh3XCIsXCJieHhcIixcImJ4elwiLFwiYnlhXCIsXCJieWJcIixcImJ5Y1wiLFwiYnlkXCIsXCJieWVcIixcImJ5ZlwiLFwiYnlnXCIsXCJieWhcIixcImJ5aVwiLFwiYnlqXCIsXCJieWtcIixcImJ5bFwiLFwiYnltXCIsXCJieW5cIixcImJ5b1wiLFwiYnlwXCIsXCJieXFcIixcImJ5clwiLFwiYnlzXCIsXCJieXRcIixcImJ5dlwiLFwiYnl3XCIsXCJieXhcIixcImJ5eVwiLFwiYnl6XCIsXCJiemFcIixcImJ6YlwiLFwiYnpjXCIsXCJiemRcIixcImJ6ZVwiLFwiYnpmXCIsXCJiemdcIixcImJ6aFwiLFwiYnppXCIsXCJiempcIixcImJ6a1wiLFwiYnpsXCIsXCJiem1cIixcImJ6blwiLFwiYnpvXCIsXCJienBcIixcImJ6cVwiLFwiYnpyXCIsXCJienNcIixcImJ6dFwiLFwiYnp1XCIsXCJienZcIixcImJ6d1wiLFwiYnp4XCIsXCJienlcIixcImJ6elwiXVxuLFsgXCJjYVwiLFwiY2VcIixcImNoXCIsXCJjb1wiLFwiY3JcIixcImNzXCIsXCJjdVwiLFwiY3ZcIixcImN5XCIsXCJjYWFcIixcImNhYlwiLFwiY2FjXCIsXCJjYWRcIixcImNhZVwiLFwiY2FmXCIsXCJjYWdcIixcImNhaFwiLFwiY2FpXCIsXCJjYWpcIixcImNha1wiLFwiY2FsXCIsXCJjYW1cIixcImNhblwiLFwiY2FvXCIsXCJjYXBcIixcImNhcVwiLFwiY2FyXCIsXCJjYXNcIixcImNhdVwiLFwiY2F2XCIsXCJjYXdcIixcImNheFwiLFwiY2F5XCIsXCJjYXpcIixcImNiYVwiLFwiY2JiXCIsXCJjYmNcIixcImNiZFwiLFwiY2JlXCIsXCJjYmdcIixcImNiaFwiLFwiY2JpXCIsXCJjYmpcIixcImNia1wiLFwiY2JsXCIsXCJjYm5cIixcImNib1wiLFwiY2JxXCIsXCJjYnJcIixcImNic1wiLFwiY2J0XCIsXCJjYnVcIixcImNidlwiLFwiY2J3XCIsXCJjYnlcIixcImNjYVwiLFwiY2NjXCIsXCJjY2RcIixcImNjZVwiLFwiY2NnXCIsXCJjY2hcIixcImNjalwiLFwiY2NsXCIsXCJjY21cIixcImNjblwiLFwiY2NvXCIsXCJjY3BcIixcImNjcVwiLFwiY2NyXCIsXCJjY3NcIixcImNkYVwiLFwiY2RjXCIsXCJjZGRcIixcImNkZVwiLFwiY2RmXCIsXCJjZGdcIixcImNkaFwiLFwiY2RpXCIsXCJjZGpcIixcImNkbVwiLFwiY2RuXCIsXCJjZG9cIixcImNkclwiLFwiY2RzXCIsXCJjZHlcIixcImNkelwiLFwiY2VhXCIsXCJjZWJcIixcImNlZ1wiLFwiY2VrXCIsXCJjZWxcIixcImNlblwiLFwiY2V0XCIsXCJjZXlcIixcImNmYVwiLFwiY2ZkXCIsXCJjZmdcIixcImNmbVwiLFwiY2dhXCIsXCJjZ2NcIixcImNnZ1wiLFwiY2drXCIsXCJjaGJcIixcImNoY1wiLFwiY2hkXCIsXCJjaGZcIixcImNoZ1wiLFwiY2hoXCIsXCJjaGpcIixcImNoa1wiLFwiY2hsXCIsXCJjaG1cIixcImNoblwiLFwiY2hvXCIsXCJjaHBcIixcImNocVwiLFwiY2hyXCIsXCJjaHRcIixcImNod1wiLFwiY2h4XCIsXCJjaHlcIixcImNoelwiLFwiY2lhXCIsXCJjaWJcIixcImNpY1wiLFwiY2lkXCIsXCJjaWVcIixcImNpaFwiLFwiY2lrXCIsXCJjaW1cIixcImNpblwiLFwiY2lwXCIsXCJjaXJcIixcImNpd1wiLFwiY2l5XCIsXCJjamFcIixcImNqZVwiLFwiY2poXCIsXCJjamlcIixcImNqa1wiLFwiY2ptXCIsXCJjam5cIixcImNqb1wiLFwiY2pwXCIsXCJjanJcIixcImNqc1wiLFwiY2p2XCIsXCJjanlcIixcImNrYVwiLFwiY2tiXCIsXCJja2hcIixcImNrbFwiLFwiY2ttXCIsXCJja25cIixcImNrb1wiLFwiY2txXCIsXCJja3JcIixcImNrc1wiLFwiY2t0XCIsXCJja3VcIixcImNrdlwiLFwiY2t4XCIsXCJja3lcIixcImNrelwiLFwiY2xhXCIsXCJjbGNcIixcImNsZFwiLFwiY2xlXCIsXCJjbGhcIixcImNsaVwiLFwiY2xqXCIsXCJjbGtcIixcImNsbFwiLFwiY2xtXCIsXCJjbG9cIixcImNsdFwiLFwiY2x1XCIsXCJjbHdcIixcImNseVwiLFwiY21hXCIsXCJjbWNcIixcImNtZVwiLFwiY21nXCIsXCJjbWlcIixcImNta1wiLFwiY21sXCIsXCJjbW1cIixcImNtblwiLFwiY21vXCIsXCJjbXJcIixcImNtc1wiLFwiY210XCIsXCJjbmFcIixcImNuYlwiLFwiY25jXCIsXCJjbmdcIixcImNuaFwiLFwiY25pXCIsXCJjbmtcIixcImNubFwiLFwiY25vXCIsXCJjbnBcIixcImNuclwiLFwiY25zXCIsXCJjbnRcIixcImNudVwiLFwiY253XCIsXCJjbnhcIixcImNvYVwiLFwiY29iXCIsXCJjb2NcIixcImNvZFwiLFwiY29lXCIsXCJjb2ZcIixcImNvZ1wiLFwiY29oXCIsXCJjb2pcIixcImNva1wiLFwiY29sXCIsXCJjb21cIixcImNvblwiLFwiY29vXCIsXCJjb3BcIixcImNvcVwiLFwiY290XCIsXCJjb3VcIixcImNvdlwiLFwiY293XCIsXCJjb3hcIixcImNveVwiLFwiY296XCIsXCJjcGFcIixcImNwYlwiLFwiY3BjXCIsXCJjcGVcIixcImNwZlwiLFwiY3BnXCIsXCJjcGlcIixcImNwblwiLFwiY3BvXCIsXCJjcHBcIixcImNwc1wiLFwiY3B1XCIsXCJjcHhcIixcImNweVwiLFwiY3FkXCIsXCJjcXVcIixcImNyYVwiLFwiY3JiXCIsXCJjcmNcIixcImNyZFwiLFwiY3JmXCIsXCJjcmdcIixcImNyaFwiLFwiY3JpXCIsXCJjcmpcIixcImNya1wiLFwiY3JsXCIsXCJjcm1cIixcImNyblwiLFwiY3JvXCIsXCJjcnBcIixcImNycVwiLFwiY3JyXCIsXCJjcnNcIixcImNydFwiLFwiY3J2XCIsXCJjcndcIixcImNyeFwiLFwiY3J5XCIsXCJjcnpcIixcImNzYVwiLFwiY3NiXCIsXCJjc2NcIixcImNzZFwiLFwiY3NlXCIsXCJjc2ZcIixcImNzZ1wiLFwiY3NoXCIsXCJjc2lcIixcImNzalwiLFwiY3NrXCIsXCJjc2xcIixcImNzbVwiLFwiY3NuXCIsXCJjc29cIixcImNzcFwiLFwiY3NxXCIsXCJjc3JcIixcImNzc1wiLFwiY3N0XCIsXCJjc3VcIixcImNzdlwiLFwiY3N3XCIsXCJjc3hcIixcImNzeVwiLFwiY3N6XCIsXCJjdGFcIixcImN0Y1wiLFwiY3RkXCIsXCJjdGVcIixcImN0Z1wiLFwiY3RoXCIsXCJjdGxcIixcImN0bVwiLFwiY3RuXCIsXCJjdG9cIixcImN0cFwiLFwiY3RzXCIsXCJjdHRcIixcImN0dVwiLFwiY3R5XCIsXCJjdHpcIixcImN1YVwiLFwiY3ViXCIsXCJjdWNcIixcImN1Z1wiLFwiY3VoXCIsXCJjdWlcIixcImN1alwiLFwiY3VrXCIsXCJjdWxcIixcImN1bVwiLFwiY3VvXCIsXCJjdXBcIixcImN1cVwiLFwiY3VyXCIsXCJjdXNcIixcImN1dFwiLFwiY3V1XCIsXCJjdXZcIixcImN1d1wiLFwiY3V4XCIsXCJjdXlcIixcImN2Z1wiLFwiY3ZuXCIsXCJjd2FcIixcImN3YlwiLFwiY3dkXCIsXCJjd2VcIixcImN3Z1wiLFwiY3d0XCIsXCJjeWFcIixcImN5YlwiLFwiY3lvXCIsXCJjemhcIixcImN6a1wiLFwiY3puXCIsXCJjem9cIixcImN6dFwiXVxuLFsgXCJkYVwiLFwiZGVcIixcImR2XCIsXCJkelwiLFwiZGFhXCIsXCJkYWNcIixcImRhZFwiLFwiZGFlXCIsXCJkYWZcIixcImRhZ1wiLFwiZGFoXCIsXCJkYWlcIixcImRhalwiLFwiZGFrXCIsXCJkYWxcIixcImRhbVwiLFwiZGFvXCIsXCJkYXBcIixcImRhcVwiLFwiZGFyXCIsXCJkYXNcIixcImRhdVwiLFwiZGF2XCIsXCJkYXdcIixcImRheFwiLFwiZGF5XCIsXCJkYXpcIixcImRiYVwiLFwiZGJiXCIsXCJkYmRcIixcImRiZVwiLFwiZGJmXCIsXCJkYmdcIixcImRiaVwiLFwiZGJqXCIsXCJkYmxcIixcImRibVwiLFwiZGJuXCIsXCJkYm9cIixcImRicFwiLFwiZGJxXCIsXCJkYnJcIixcImRidFwiLFwiZGJ1XCIsXCJkYnZcIixcImRid1wiLFwiZGJ5XCIsXCJkY2NcIixcImRjclwiLFwiZGRhXCIsXCJkZGRcIixcImRkZVwiLFwiZGRnXCIsXCJkZGlcIixcImRkalwiLFwiZGRuXCIsXCJkZG9cIixcImRkclwiLFwiZGRzXCIsXCJkZHdcIixcImRlY1wiLFwiZGVkXCIsXCJkZWVcIixcImRlZlwiLFwiZGVnXCIsXCJkZWhcIixcImRlaVwiLFwiZGVrXCIsXCJkZWxcIixcImRlbVwiLFwiZGVuXCIsXCJkZXBcIixcImRlcVwiLFwiZGVyXCIsXCJkZXNcIixcImRldlwiLFwiZGV6XCIsXCJkZ2FcIixcImRnYlwiLFwiZGdjXCIsXCJkZ2RcIixcImRnZVwiLFwiZGdnXCIsXCJkZ2hcIixcImRnaVwiLFwiZGdrXCIsXCJkZ2xcIixcImRnblwiLFwiZGdvXCIsXCJkZ3JcIixcImRnc1wiLFwiZGd0XCIsXCJkZ3VcIixcImRnd1wiLFwiZGd4XCIsXCJkZ3pcIixcImRoYVwiLFwiZGhkXCIsXCJkaGdcIixcImRoaVwiLFwiZGhsXCIsXCJkaG1cIixcImRoblwiLFwiZGhvXCIsXCJkaHJcIixcImRoc1wiLFwiZGh1XCIsXCJkaHZcIixcImRod1wiLFwiZGh4XCIsXCJkaWFcIixcImRpYlwiLFwiZGljXCIsXCJkaWRcIixcImRpZlwiLFwiZGlnXCIsXCJkaWhcIixcImRpaVwiLFwiZGlqXCIsXCJkaWtcIixcImRpbFwiLFwiZGltXCIsXCJkaW5cIixcImRpb1wiLFwiZGlwXCIsXCJkaXFcIixcImRpclwiLFwiZGlzXCIsXCJkaXRcIixcImRpdVwiLFwiZGl3XCIsXCJkaXhcIixcImRpeVwiLFwiZGl6XCIsXCJkamFcIixcImRqYlwiLFwiZGpjXCIsXCJkamRcIixcImRqZVwiLFwiZGpmXCIsXCJkamlcIixcImRqalwiLFwiZGprXCIsXCJkamxcIixcImRqbVwiLFwiZGpuXCIsXCJkam9cIixcImRqclwiLFwiZGp1XCIsXCJkandcIixcImRrYVwiLFwiZGtnXCIsXCJka2tcIixcImRrbFwiLFwiZGtyXCIsXCJka3NcIixcImRreFwiLFwiZGxnXCIsXCJkbGtcIixcImRsbVwiLFwiZGxuXCIsXCJkbWFcIixcImRtYlwiLFwiZG1jXCIsXCJkbWRcIixcImRtZVwiLFwiZG1mXCIsXCJkbWdcIixcImRta1wiLFwiZG1sXCIsXCJkbW1cIixcImRtblwiLFwiZG1vXCIsXCJkbXJcIixcImRtc1wiLFwiZG11XCIsXCJkbXZcIixcImRtd1wiLFwiZG14XCIsXCJkbXlcIixcImRuYVwiLFwiZG5kXCIsXCJkbmVcIixcImRuZ1wiLFwiZG5pXCIsXCJkbmpcIixcImRua1wiLFwiZG5uXCIsXCJkbm9cIixcImRuclwiLFwiZG50XCIsXCJkbnVcIixcImRudlwiLFwiZG53XCIsXCJkbnlcIixcImRvYVwiLFwiZG9iXCIsXCJkb2NcIixcImRvZVwiLFwiZG9mXCIsXCJkb2hcIixcImRvaVwiLFwiZG9rXCIsXCJkb2xcIixcImRvblwiLFwiZG9vXCIsXCJkb3BcIixcImRvcVwiLFwiZG9yXCIsXCJkb3NcIixcImRvdFwiLFwiZG92XCIsXCJkb3dcIixcImRveFwiLFwiZG95XCIsXCJkb3pcIixcImRwcFwiLFwiZHJhXCIsXCJkcmJcIixcImRyY1wiLFwiZHJkXCIsXCJkcmVcIixcImRyZ1wiLFwiZHJoXCIsXCJkcmlcIixcImRybFwiLFwiZHJuXCIsXCJkcm9cIixcImRycVwiLFwiZHJyXCIsXCJkcnNcIixcImRydFwiLFwiZHJ1XCIsXCJkcndcIixcImRyeVwiLFwiZHNiXCIsXCJkc2VcIixcImRzaFwiLFwiZHNpXCIsXCJkc2xcIixcImRzblwiLFwiZHNvXCIsXCJkc3FcIixcImR0YVwiLFwiZHRiXCIsXCJkdGRcIixcImR0aFwiLFwiZHRpXCIsXCJkdGtcIixcImR0bVwiLFwiZHRuXCIsXCJkdG9cIixcImR0cFwiLFwiZHRyXCIsXCJkdHNcIixcImR0dFwiLFwiZHR1XCIsXCJkdHlcIixcImR1YVwiLFwiZHViXCIsXCJkdWNcIixcImR1ZFwiLFwiZHVlXCIsXCJkdWZcIixcImR1Z1wiLFwiZHVoXCIsXCJkdWlcIixcImR1alwiLFwiZHVrXCIsXCJkdWxcIixcImR1bVwiLFwiZHVuXCIsXCJkdW9cIixcImR1cFwiLFwiZHVxXCIsXCJkdXJcIixcImR1c1wiLFwiZHV1XCIsXCJkdXZcIixcImR1d1wiLFwiZHV4XCIsXCJkdXlcIixcImR1elwiLFwiZHZhXCIsXCJkd2FcIixcImR3a1wiLFwiZHdsXCIsXCJkd3JcIixcImR3c1wiLFwiZHd1XCIsXCJkd3dcIixcImR3eVwiLFwiZHd6XCIsXCJkeWFcIixcImR5YlwiLFwiZHlkXCIsXCJkeWdcIixcImR5aVwiLFwiZHltXCIsXCJkeW5cIixcImR5b1wiLFwiZHl1XCIsXCJkeXlcIixcImR6YVwiLFwiZHpkXCIsXCJkemVcIixcImR6Z1wiLFwiZHpsXCIsXCJkem5cIl1cbixbIFwiZWVcIixcImVsXCIsXCJlblwiLFwiZW9cIixcImVzXCIsXCJldFwiLFwiZXVcIixcImVhYVwiLFwiZWJjXCIsXCJlYmdcIixcImVia1wiLFwiZWJvXCIsXCJlYnJcIixcImVidVwiLFwiZWNyXCIsXCJlY3NcIixcImVjeVwiLFwiZWVlXCIsXCJlZmFcIixcImVmZVwiLFwiZWZpXCIsXCJlZ2FcIixcImVnbFwiLFwiZWdvXCIsXCJlZ3hcIixcImVneVwiLFwiZWhzXCIsXCJlaHVcIixcImVpcFwiLFwiZWl0XCIsXCJlaXZcIixcImVqYVwiLFwiZWthXCIsXCJla2NcIixcImVrZVwiLFwiZWtnXCIsXCJla2lcIixcImVra1wiLFwiZWtsXCIsXCJla21cIixcImVrb1wiLFwiZWtwXCIsXCJla3JcIixcImVreVwiLFwiZWxlXCIsXCJlbGhcIixcImVsaVwiLFwiZWxrXCIsXCJlbG1cIixcImVsb1wiLFwiZWxwXCIsXCJlbHVcIixcImVseFwiLFwiZW1hXCIsXCJlbWJcIixcImVtZVwiLFwiZW1nXCIsXCJlbWlcIixcImVta1wiLFwiZW1tXCIsXCJlbW5cIixcImVtb1wiLFwiZW1wXCIsXCJlbXFcIixcImVtc1wiLFwiZW11XCIsXCJlbXdcIixcImVteFwiLFwiZW15XCIsXCJlbXpcIixcImVuYVwiLFwiZW5iXCIsXCJlbmNcIixcImVuZFwiLFwiZW5mXCIsXCJlbmhcIixcImVubFwiLFwiZW5tXCIsXCJlbm5cIixcImVub1wiLFwiZW5xXCIsXCJlbnJcIixcImVudVwiLFwiZW52XCIsXCJlbndcIixcImVueFwiLFwiZW90XCIsXCJlcGlcIixcImVyYVwiLFwiZXJnXCIsXCJlcmhcIixcImVyaVwiLFwiZXJrXCIsXCJlcm9cIixcImVyclwiLFwiZXJzXCIsXCJlcnRcIixcImVyd1wiLFwiZXNlXCIsXCJlc2dcIixcImVzaFwiLFwiZXNpXCIsXCJlc2tcIixcImVzbFwiLFwiZXNtXCIsXCJlc25cIixcImVzb1wiLFwiZXNxXCIsXCJlc3NcIixcImVzdVwiLFwiZXN4XCIsXCJlc3lcIixcImV0YlwiLFwiZXRjXCIsXCJldGhcIixcImV0blwiLFwiZXRvXCIsXCJldHJcIixcImV0c1wiLFwiZXR0XCIsXCJldHVcIixcImV0eFwiLFwiZXR6XCIsXCJldXFcIixcImV2ZVwiLFwiZXZoXCIsXCJldm5cIixcImV3b1wiLFwiZXh0XCIsXCJleWFcIixcImV5b1wiLFwiZXphXCIsXCJlemVcIl1cbixbIFwiZmFcIixcImZmXCIsXCJmaVwiLFwiZmpcIixcImZvXCIsXCJmclwiLFwiZnlcIixcImZhYVwiLFwiZmFiXCIsXCJmYWRcIixcImZhZlwiLFwiZmFnXCIsXCJmYWhcIixcImZhaVwiLFwiZmFqXCIsXCJmYWtcIixcImZhbFwiLFwiZmFtXCIsXCJmYW5cIixcImZhcFwiLFwiZmFyXCIsXCJmYXRcIixcImZhdVwiLFwiZmF4XCIsXCJmYXlcIixcImZhelwiLFwiZmJsXCIsXCJmY3NcIixcImZlclwiLFwiZmZpXCIsXCJmZm1cIixcImZnclwiLFwiZmlhXCIsXCJmaWVcIixcImZpZlwiLFwiZmlsXCIsXCJmaXBcIixcImZpclwiLFwiZml0XCIsXCJmaXVcIixcImZpd1wiLFwiZmtrXCIsXCJma3ZcIixcImZsYVwiLFwiZmxoXCIsXCJmbGlcIixcImZsbFwiLFwiZmxuXCIsXCJmbHJcIixcImZseVwiLFwiZm1wXCIsXCJmbXVcIixcImZuYlwiLFwiZm5nXCIsXCJmbmlcIixcImZvZFwiLFwiZm9pXCIsXCJmb21cIixcImZvblwiLFwiZm9yXCIsXCJmb3NcIixcImZveFwiLFwiZnBlXCIsXCJmcXNcIixcImZyY1wiLFwiZnJkXCIsXCJmcmtcIixcImZybVwiLFwiZnJvXCIsXCJmcnBcIixcImZycVwiLFwiZnJyXCIsXCJmcnNcIixcImZydFwiLFwiZnNlXCIsXCJmc2xcIixcImZzc1wiLFwiZnViXCIsXCJmdWNcIixcImZ1ZFwiLFwiZnVlXCIsXCJmdWZcIixcImZ1aFwiLFwiZnVpXCIsXCJmdWpcIixcImZ1bVwiLFwiZnVuXCIsXCJmdXFcIixcImZ1clwiLFwiZnV0XCIsXCJmdXVcIixcImZ1dlwiLFwiZnV5XCIsXCJmdnJcIixcImZ3YVwiLFwiZndlXCJdXG4sWyBcImdhXCIsXCJnZFwiLFwiZ2xcIixcImduXCIsXCJndVwiLFwiZ3ZcIixcImdhYVwiLFwiZ2FiXCIsXCJnYWNcIixcImdhZFwiLFwiZ2FlXCIsXCJnYWZcIixcImdhZ1wiLFwiZ2FoXCIsXCJnYWlcIixcImdhalwiLFwiZ2FrXCIsXCJnYWxcIixcImdhbVwiLFwiZ2FuXCIsXCJnYW9cIixcImdhcFwiLFwiZ2FxXCIsXCJnYXJcIixcImdhc1wiLFwiZ2F0XCIsXCJnYXVcIixcImdhdlwiLFwiZ2F3XCIsXCJnYXhcIixcImdheVwiLFwiZ2F6XCIsXCJnYmFcIixcImdiYlwiLFwiZ2JjXCIsXCJnYmRcIixcImdiZVwiLFwiZ2JmXCIsXCJnYmdcIixcImdiaFwiLFwiZ2JpXCIsXCJnYmpcIixcImdia1wiLFwiZ2JsXCIsXCJnYm1cIixcImdiblwiLFwiZ2JvXCIsXCJnYnBcIixcImdicVwiLFwiZ2JyXCIsXCJnYnNcIixcImdidVwiLFwiZ2J2XCIsXCJnYndcIixcImdieFwiLFwiZ2J5XCIsXCJnYnpcIixcImdjY1wiLFwiZ2NkXCIsXCJnY2VcIixcImdjZlwiLFwiZ2NsXCIsXCJnY25cIixcImdjclwiLFwiZ2N0XCIsXCJnZGFcIixcImdkYlwiLFwiZ2RjXCIsXCJnZGRcIixcImdkZVwiLFwiZ2RmXCIsXCJnZGdcIixcImdkaFwiLFwiZ2RpXCIsXCJnZGpcIixcImdka1wiLFwiZ2RsXCIsXCJnZG1cIixcImdkblwiLFwiZ2RvXCIsXCJnZHFcIixcImdkclwiLFwiZ2RzXCIsXCJnZHRcIixcImdkdVwiLFwiZ2R4XCIsXCJnZWFcIixcImdlYlwiLFwiZ2VjXCIsXCJnZWRcIixcImdlZlwiLFwiZ2VnXCIsXCJnZWhcIixcImdlaVwiLFwiZ2VqXCIsXCJnZWtcIixcImdlbFwiLFwiZ2VtXCIsXCJnZXFcIixcImdlc1wiLFwiZ2V2XCIsXCJnZXdcIixcImdleFwiLFwiZ2V5XCIsXCJnZXpcIixcImdma1wiLFwiZ2Z0XCIsXCJnZnhcIixcImdnYVwiLFwiZ2diXCIsXCJnZ2RcIixcImdnZVwiLFwiZ2dnXCIsXCJnZ2tcIixcImdnbFwiLFwiZ2duXCIsXCJnZ29cIixcImdnclwiLFwiZ2d0XCIsXCJnZ3VcIixcImdnd1wiLFwiZ2hhXCIsXCJnaGNcIixcImdoZVwiLFwiZ2hoXCIsXCJnaGtcIixcImdobFwiLFwiZ2huXCIsXCJnaG9cIixcImdoclwiLFwiZ2hzXCIsXCJnaHRcIixcImdpYVwiLFwiZ2liXCIsXCJnaWNcIixcImdpZFwiLFwiZ2llXCIsXCJnaWdcIixcImdpaFwiLFwiZ2lpXCIsXCJnaWxcIixcImdpbVwiLFwiZ2luXCIsXCJnaW9cIixcImdpcFwiLFwiZ2lxXCIsXCJnaXJcIixcImdpc1wiLFwiZ2l0XCIsXCJnaXVcIixcImdpd1wiLFwiZ2l4XCIsXCJnaXlcIixcImdpelwiLFwiZ2ppXCIsXCJnamtcIixcImdqbVwiLFwiZ2puXCIsXCJnanJcIixcImdqdVwiLFwiZ2thXCIsXCJna2RcIixcImdrZVwiLFwiZ2tuXCIsXCJna29cIixcImdrcFwiLFwiZ2t1XCIsXCJnbGJcIixcImdsY1wiLFwiZ2xkXCIsXCJnbGhcIixcImdsaVwiLFwiZ2xqXCIsXCJnbGtcIixcImdsbFwiLFwiZ2xvXCIsXCJnbHJcIixcImdsdVwiLFwiZ2x3XCIsXCJnbHlcIixcImdtYVwiLFwiZ21iXCIsXCJnbWRcIixcImdtZVwiLFwiZ21nXCIsXCJnbWhcIixcImdtbFwiLFwiZ21tXCIsXCJnbW5cIixcImdtcVwiLFwiZ21yXCIsXCJnbXVcIixcImdtdlwiLFwiZ213XCIsXCJnbXhcIixcImdteVwiLFwiZ216XCIsXCJnbmFcIixcImduYlwiLFwiZ25jXCIsXCJnbmRcIixcImduZVwiLFwiZ25nXCIsXCJnbmhcIixcImduaVwiLFwiZ25qXCIsXCJnbmtcIixcImdubFwiLFwiZ25tXCIsXCJnbm5cIixcImdub1wiLFwiZ25xXCIsXCJnbnJcIixcImdudFwiLFwiZ251XCIsXCJnbndcIixcImduelwiLFwiZ29hXCIsXCJnb2JcIixcImdvY1wiLFwiZ29kXCIsXCJnb2VcIixcImdvZlwiLFwiZ29nXCIsXCJnb2hcIixcImdvaVwiLFwiZ29qXCIsXCJnb2tcIixcImdvbFwiLFwiZ29tXCIsXCJnb25cIixcImdvb1wiLFwiZ29wXCIsXCJnb3FcIixcImdvclwiLFwiZ29zXCIsXCJnb3RcIixcImdvdVwiLFwiZ293XCIsXCJnb3hcIixcImdveVwiLFwiZ296XCIsXCJncGFcIixcImdwZVwiLFwiZ3BuXCIsXCJncWFcIixcImdxaVwiLFwiZ3FuXCIsXCJncXJcIixcImdxdVwiLFwiZ3JhXCIsXCJncmJcIixcImdyY1wiLFwiZ3JkXCIsXCJncmdcIixcImdyaFwiLFwiZ3JpXCIsXCJncmpcIixcImdya1wiLFwiZ3JtXCIsXCJncm9cIixcImdycVwiLFwiZ3JyXCIsXCJncnNcIixcImdydFwiLFwiZ3J1XCIsXCJncnZcIixcImdyd1wiLFwiZ3J4XCIsXCJncnlcIixcImdyelwiLFwiZ3NlXCIsXCJnc2dcIixcImdzbFwiLFwiZ3NtXCIsXCJnc25cIixcImdzb1wiLFwiZ3NwXCIsXCJnc3NcIixcImdzd1wiLFwiZ3RhXCIsXCJndGlcIixcImd0dVwiLFwiZ3VhXCIsXCJndWJcIixcImd1Y1wiLFwiZ3VkXCIsXCJndWVcIixcImd1ZlwiLFwiZ3VnXCIsXCJndWhcIixcImd1aVwiLFwiZ3VrXCIsXCJndWxcIixcImd1bVwiLFwiZ3VuXCIsXCJndW9cIixcImd1cFwiLFwiZ3VxXCIsXCJndXJcIixcImd1c1wiLFwiZ3V0XCIsXCJndXVcIixcImd1dlwiLFwiZ3V3XCIsXCJndXhcIixcImd1elwiLFwiZ3ZhXCIsXCJndmNcIixcImd2ZVwiLFwiZ3ZmXCIsXCJndmpcIixcImd2bFwiLFwiZ3ZtXCIsXCJndm5cIixcImd2b1wiLFwiZ3ZwXCIsXCJndnJcIixcImd2c1wiLFwiZ3Z5XCIsXCJnd2FcIixcImd3YlwiLFwiZ3djXCIsXCJnd2RcIixcImd3ZVwiLFwiZ3dmXCIsXCJnd2dcIixcImd3aVwiLFwiZ3dqXCIsXCJnd21cIixcImd3blwiLFwiZ3dyXCIsXCJnd3RcIixcImd3dVwiLFwiZ3d3XCIsXCJnd3hcIixcImd4eFwiLFwiZ3lhXCIsXCJneWJcIixcImd5ZFwiLFwiZ3llXCIsXCJneWZcIixcImd5Z1wiLFwiZ3lpXCIsXCJneWxcIixcImd5bVwiLFwiZ3luXCIsXCJneW9cIixcImd5clwiLFwiZ3l5XCIsXCJneXpcIixcImd6YVwiLFwiZ3ppXCIsXCJnem5cIl1cbixbIFwiaGFcIixcImhlXCIsXCJoaVwiLFwiaG9cIixcImhyXCIsXCJodFwiLFwiaHVcIixcImh5XCIsXCJoelwiLFwiaGFhXCIsXCJoYWJcIixcImhhY1wiLFwiaGFkXCIsXCJoYWVcIixcImhhZlwiLFwiaGFnXCIsXCJoYWhcIixcImhhaVwiLFwiaGFqXCIsXCJoYWtcIixcImhhbFwiLFwiaGFtXCIsXCJoYW5cIixcImhhb1wiLFwiaGFwXCIsXCJoYXFcIixcImhhclwiLFwiaGFzXCIsXCJoYXZcIixcImhhd1wiLFwiaGF4XCIsXCJoYXlcIixcImhhelwiLFwiaGJhXCIsXCJoYmJcIixcImhiblwiLFwiaGJvXCIsXCJoYnVcIixcImhjYVwiLFwiaGNoXCIsXCJoZG5cIixcImhkc1wiLFwiaGR5XCIsXCJoZWFcIixcImhlZFwiLFwiaGVnXCIsXCJoZWhcIixcImhlaVwiLFwiaGVtXCIsXCJoZ21cIixcImhnd1wiLFwiaGhpXCIsXCJoaHJcIixcImhoeVwiLFwiaGlhXCIsXCJoaWJcIixcImhpZFwiLFwiaGlmXCIsXCJoaWdcIixcImhpaFwiLFwiaGlpXCIsXCJoaWpcIixcImhpa1wiLFwiaGlsXCIsXCJoaW1cIixcImhpb1wiLFwiaGlyXCIsXCJoaXRcIixcImhpd1wiLFwiaGl4XCIsXCJoamlcIixcImhrYVwiLFwiaGtlXCIsXCJoa2hcIixcImhra1wiLFwiaGtuXCIsXCJoa3NcIixcImhsYVwiLFwiaGxiXCIsXCJobGRcIixcImhsZVwiLFwiaGx0XCIsXCJobHVcIixcImhtYVwiLFwiaG1iXCIsXCJobWNcIixcImhtZFwiLFwiaG1lXCIsXCJobWZcIixcImhtZ1wiLFwiaG1oXCIsXCJobWlcIixcImhtalwiLFwiaG1rXCIsXCJobWxcIixcImhtbVwiLFwiaG1uXCIsXCJobXBcIixcImhtcVwiLFwiaG1yXCIsXCJobXNcIixcImhtdFwiLFwiaG11XCIsXCJobXZcIixcImhtd1wiLFwiaG14XCIsXCJobXlcIixcImhtelwiLFwiaG5hXCIsXCJobmRcIixcImhuZVwiLFwiaG5nXCIsXCJobmhcIixcImhuaVwiLFwiaG5qXCIsXCJobm5cIixcImhub1wiLFwiaG5zXCIsXCJobnVcIixcImhvYVwiLFwiaG9iXCIsXCJob2NcIixcImhvZFwiLFwiaG9lXCIsXCJob2hcIixcImhvaVwiLFwiaG9qXCIsXCJob2tcIixcImhvbFwiLFwiaG9tXCIsXCJob29cIixcImhvcFwiLFwiaG9yXCIsXCJob3NcIixcImhvdFwiLFwiaG92XCIsXCJob3dcIixcImhveVwiLFwiaG96XCIsXCJocG9cIixcImhwc1wiLFwiaHJhXCIsXCJocmNcIixcImhyZVwiLFwiaHJrXCIsXCJocm1cIixcImhyb1wiLFwiaHJwXCIsXCJocnJcIixcImhydFwiLFwiaHJ1XCIsXCJocndcIixcImhyeFwiLFwiaHJ6XCIsXCJoc2JcIixcImhzaFwiLFwiaHNsXCIsXCJoc25cIixcImhzc1wiLFwiaHRpXCIsXCJodG9cIixcImh0c1wiLFwiaHR1XCIsXCJodHhcIixcImh1YlwiLFwiaHVjXCIsXCJodWRcIixcImh1ZVwiLFwiaHVmXCIsXCJodWdcIixcImh1aFwiLFwiaHVpXCIsXCJodWpcIixcImh1a1wiLFwiaHVsXCIsXCJodW1cIixcImh1b1wiLFwiaHVwXCIsXCJodXFcIixcImh1clwiLFwiaHVzXCIsXCJodXRcIixcImh1dVwiLFwiaHV2XCIsXCJodXdcIixcImh1eFwiLFwiaHV5XCIsXCJodXpcIixcImh2Y1wiLFwiaHZlXCIsXCJodmtcIixcImh2blwiLFwiaHZ2XCIsXCJod2FcIixcImh3Y1wiLFwiaHdvXCIsXCJoeWFcIixcImh5d1wiLFwiaHl4XCJdXG4sWyBcImlhXCIsXCJpZFwiLFwiaWVcIixcImlnXCIsXCJpaVwiLFwiaWtcIixcImluXCIsXCJpb1wiLFwiaXNcIixcIml0XCIsXCJpdVwiLFwiaXdcIixcImlhaVwiLFwiaWFuXCIsXCJpYXBcIixcImlhclwiLFwiaWJhXCIsXCJpYmJcIixcImliZFwiLFwiaWJlXCIsXCJpYmdcIixcImliaFwiLFwiaWJpXCIsXCJpYmxcIixcImlibVwiLFwiaWJuXCIsXCJpYnJcIixcImlidVwiLFwiaWJ5XCIsXCJpY2FcIixcImljaFwiLFwiaWNsXCIsXCJpY3JcIixcImlkYVwiLFwiaWRiXCIsXCJpZGNcIixcImlkZFwiLFwiaWRlXCIsXCJpZGlcIixcImlkclwiLFwiaWRzXCIsXCJpZHRcIixcImlkdVwiLFwiaWZhXCIsXCJpZmJcIixcImlmZVwiLFwiaWZmXCIsXCJpZmtcIixcImlmbVwiLFwiaWZ1XCIsXCJpZnlcIixcImlnYlwiLFwiaWdlXCIsXCJpZ2dcIixcImlnbFwiLFwiaWdtXCIsXCJpZ25cIixcImlnb1wiLFwiaWdzXCIsXCJpZ3dcIixcImloYlwiLFwiaWhpXCIsXCJpaHBcIixcImlod1wiLFwiaWluXCIsXCJpaXJcIixcImlqY1wiLFwiaWplXCIsXCJpampcIixcImlqblwiLFwiaWpvXCIsXCJpanNcIixcImlrZVwiLFwiaWtpXCIsXCJpa2tcIixcImlrbFwiLFwiaWtvXCIsXCJpa3BcIixcImlrclwiLFwiaWtzXCIsXCJpa3RcIixcImlrdlwiLFwiaWt3XCIsXCJpa3hcIixcImlrelwiLFwiaWxhXCIsXCJpbGJcIixcImlsZ1wiLFwiaWxpXCIsXCJpbGtcIixcImlsbFwiLFwiaWxtXCIsXCJpbG9cIixcImlscFwiLFwiaWxzXCIsXCJpbHVcIixcImlsdlwiLFwiaWx3XCIsXCJpbWFcIixcImltZVwiLFwiaW1pXCIsXCJpbWxcIixcImltblwiLFwiaW1vXCIsXCJpbXJcIixcImltc1wiLFwiaW15XCIsXCJpbmJcIixcImluY1wiLFwiaW5lXCIsXCJpbmdcIixcImluaFwiLFwiaW5qXCIsXCJpbmxcIixcImlubVwiLFwiaW5uXCIsXCJpbm9cIixcImlucFwiLFwiaW5zXCIsXCJpbnRcIixcImluelwiLFwiaW9yXCIsXCJpb3VcIixcImlvd1wiLFwiaXBpXCIsXCJpcG9cIixcImlxdVwiLFwiaXF3XCIsXCJpcmFcIixcImlyZVwiLFwiaXJoXCIsXCJpcmlcIixcImlya1wiLFwiaXJuXCIsXCJpcm9cIixcImlyclwiLFwiaXJ1XCIsXCJpcnhcIixcImlyeVwiLFwiaXNhXCIsXCJpc2NcIixcImlzZFwiLFwiaXNlXCIsXCJpc2dcIixcImlzaFwiLFwiaXNpXCIsXCJpc2tcIixcImlzbVwiLFwiaXNuXCIsXCJpc29cIixcImlzclwiLFwiaXN0XCIsXCJpc3VcIixcIml0YlwiLFwiaXRjXCIsXCJpdGRcIixcIml0ZVwiLFwiaXRpXCIsXCJpdGtcIixcIml0bFwiLFwiaXRtXCIsXCJpdG9cIixcIml0clwiLFwiaXRzXCIsXCJpdHRcIixcIml0dlwiLFwiaXR3XCIsXCJpdHhcIixcIml0eVwiLFwiaXR6XCIsXCJpdW1cIixcIml2YlwiLFwiaXZ2XCIsXCJpd2tcIixcIml3bVwiLFwiaXdvXCIsXCJpd3NcIixcIml4Y1wiLFwiaXhsXCIsXCJpeWFcIixcIml5b1wiLFwiaXl4XCIsXCJpemhcIixcIml6aVwiLFwiaXpyXCIsXCJpenpcIl1cbixbIFwiamFcIixcImppXCIsXCJqdlwiLFwiandcIixcImphYVwiLFwiamFiXCIsXCJqYWNcIixcImphZFwiLFwiamFlXCIsXCJqYWZcIixcImphaFwiLFwiamFqXCIsXCJqYWtcIixcImphbFwiLFwiamFtXCIsXCJqYW5cIixcImphb1wiLFwiamFxXCIsXCJqYXJcIixcImphc1wiLFwiamF0XCIsXCJqYXVcIixcImpheFwiLFwiamF5XCIsXCJqYXpcIixcImpiZVwiLFwiamJpXCIsXCJqYmpcIixcImpia1wiLFwiamJtXCIsXCJqYm5cIixcImpib1wiLFwiamJyXCIsXCJqYnRcIixcImpidVwiLFwiamJ3XCIsXCJqY3NcIixcImpjdFwiLFwiamRhXCIsXCJqZGdcIixcImpkdFwiLFwiamViXCIsXCJqZWVcIixcImplZ1wiLFwiamVoXCIsXCJqZWlcIixcImpla1wiLFwiamVsXCIsXCJqZW5cIixcImplclwiLFwiamV0XCIsXCJqZXVcIixcImpnYlwiLFwiamdlXCIsXCJqZ2tcIixcImpnb1wiLFwiamhpXCIsXCJqaHNcIixcImppYVwiLFwiamliXCIsXCJqaWNcIixcImppZFwiLFwiamllXCIsXCJqaWdcIixcImppaFwiLFwiamlpXCIsXCJqaWxcIixcImppbVwiLFwiamlvXCIsXCJqaXFcIixcImppdFwiLFwiaml1XCIsXCJqaXZcIixcImppeVwiLFwiamplXCIsXCJqanJcIixcImprYVwiLFwiamttXCIsXCJqa29cIixcImprcFwiLFwiamtyXCIsXCJqa3NcIixcImprdVwiLFwiamxlXCIsXCJqbHNcIixcImptYVwiLFwiam1iXCIsXCJqbWNcIixcImptZFwiLFwiam1pXCIsXCJqbWxcIixcImptblwiLFwiam1yXCIsXCJqbXNcIixcImptd1wiLFwiam14XCIsXCJqbmFcIixcImpuZFwiLFwiam5nXCIsXCJqbmlcIixcImpualwiLFwiam5sXCIsXCJqbnNcIixcImpvYlwiLFwiam9kXCIsXCJqb2dcIixcImpvclwiLFwiam9zXCIsXCJqb3dcIixcImpwYVwiLFwianByXCIsXCJqcHhcIixcImpxclwiLFwianJhXCIsXCJqcmJcIixcImpyclwiLFwianJ0XCIsXCJqcnVcIixcImpzbFwiLFwianVhXCIsXCJqdWJcIixcImp1Y1wiLFwianVkXCIsXCJqdWhcIixcImp1aVwiLFwianVrXCIsXCJqdWxcIixcImp1bVwiLFwianVuXCIsXCJqdW9cIixcImp1cFwiLFwianVyXCIsXCJqdXNcIixcImp1dFwiLFwianV1XCIsXCJqdXdcIixcImp1eVwiLFwianZkXCIsXCJqdm5cIixcImp3aVwiLFwianlhXCIsXCJqeWVcIixcImp5eVwiXVxuLFsgXCJrYVwiLFwia2dcIixcImtpXCIsXCJralwiLFwia2tcIixcImtsXCIsXCJrbVwiLFwia25cIixcImtvXCIsXCJrclwiLFwia3NcIixcImt1XCIsXCJrdlwiLFwia3dcIixcImt5XCIsXCJrYWFcIixcImthYlwiLFwia2FjXCIsXCJrYWRcIixcImthZVwiLFwia2FmXCIsXCJrYWdcIixcImthaFwiLFwia2FpXCIsXCJrYWpcIixcImtha1wiLFwia2FtXCIsXCJrYW9cIixcImthcFwiLFwia2FxXCIsXCJrYXJcIixcImthdlwiLFwia2F3XCIsXCJrYXhcIixcImtheVwiLFwia2JhXCIsXCJrYmJcIixcImtiY1wiLFwia2JkXCIsXCJrYmVcIixcImtiZlwiLFwia2JnXCIsXCJrYmhcIixcImtiaVwiLFwia2JqXCIsXCJrYmtcIixcImtibFwiLFwia2JtXCIsXCJrYm5cIixcImtib1wiLFwia2JwXCIsXCJrYnFcIixcImticlwiLFwia2JzXCIsXCJrYnRcIixcImtidVwiLFwia2J2XCIsXCJrYndcIixcImtieFwiLFwia2J5XCIsXCJrYnpcIixcImtjYVwiLFwia2NiXCIsXCJrY2NcIixcImtjZFwiLFwia2NlXCIsXCJrY2ZcIixcImtjZ1wiLFwia2NoXCIsXCJrY2lcIixcImtjalwiLFwia2NrXCIsXCJrY2xcIixcImtjbVwiLFwia2NuXCIsXCJrY29cIixcImtjcFwiLFwia2NxXCIsXCJrY3JcIixcImtjc1wiLFwia2N0XCIsXCJrY3VcIixcImtjdlwiLFwia2N3XCIsXCJrY3hcIixcImtjeVwiLFwia2N6XCIsXCJrZGFcIixcImtkY1wiLFwia2RkXCIsXCJrZGVcIixcImtkZlwiLFwia2RnXCIsXCJrZGhcIixcImtkaVwiLFwia2RqXCIsXCJrZGtcIixcImtkbFwiLFwia2RtXCIsXCJrZG5cIixcImtkb1wiLFwia2RwXCIsXCJrZHFcIixcImtkclwiLFwia2R0XCIsXCJrZHVcIixcImtkdlwiLFwia2R3XCIsXCJrZHhcIixcImtkeVwiLFwia2R6XCIsXCJrZWFcIixcImtlYlwiLFwia2VjXCIsXCJrZWRcIixcImtlZVwiLFwia2VmXCIsXCJrZWdcIixcImtlaFwiLFwia2VpXCIsXCJrZWpcIixcImtla1wiLFwia2VsXCIsXCJrZW1cIixcImtlblwiLFwia2VvXCIsXCJrZXBcIixcImtlcVwiLFwia2VyXCIsXCJrZXNcIixcImtldFwiLFwia2V1XCIsXCJrZXZcIixcImtld1wiLFwia2V4XCIsXCJrZXlcIixcImtlelwiLFwia2ZhXCIsXCJrZmJcIixcImtmY1wiLFwia2ZkXCIsXCJrZmVcIixcImtmZlwiLFwia2ZnXCIsXCJrZmhcIixcImtmaVwiLFwia2ZqXCIsXCJrZmtcIixcImtmbFwiLFwia2ZtXCIsXCJrZm5cIixcImtmb1wiLFwia2ZwXCIsXCJrZnFcIixcImtmclwiLFwia2ZzXCIsXCJrZnRcIixcImtmdVwiLFwia2Z2XCIsXCJrZndcIixcImtmeFwiLFwia2Z5XCIsXCJrZnpcIixcImtnYVwiLFwia2diXCIsXCJrZ2NcIixcImtnZFwiLFwia2dlXCIsXCJrZ2ZcIixcImtnZ1wiLFwia2doXCIsXCJrZ2lcIixcImtnalwiLFwia2drXCIsXCJrZ2xcIixcImtnbVwiLFwia2duXCIsXCJrZ29cIixcImtncFwiLFwia2dxXCIsXCJrZ3JcIixcImtnc1wiLFwia2d0XCIsXCJrZ3VcIixcImtndlwiLFwia2d3XCIsXCJrZ3hcIixcImtneVwiLFwia2hhXCIsXCJseWdcIixcImtoYlwiLFwia2hjXCIsXCJraGRcIixcImtoZVwiLFwia2hmXCIsXCJraGdcIixcImtoaFwiLFwia2hpXCIsXCJraGpcIixcImtoa1wiLFwia2hsXCIsXCJraG5cIixcImtob1wiLFwia2hwXCIsXCJraHFcIixcImtoclwiLFwia2hzXCIsXCJraHRcIixcImtodVwiLFwia2h2XCIsXCJraHdcIixcImtoeFwiLFwia2h5XCIsXCJraHpcIixcImtpYVwiLFwia2liXCIsXCJraWNcIixcImtpZFwiLFwia2llXCIsXCJraWZcIixcImtpZ1wiLFwia2loXCIsXCJraWlcIixcImtpalwiLFwia2lsXCIsXCJraW1cIixcImtpb1wiLFwia2lwXCIsXCJraXFcIixcImtpc1wiLFwia2l0XCIsXCJraXVcIixcImtpdlwiLFwia2l3XCIsXCJraXhcIixcImtpeVwiLFwia2l6XCIsXCJramFcIixcImtqYlwiLFwia2pjXCIsXCJramRcIixcImtqZVwiLFwia2pmXCIsXCJramdcIixcImtqaFwiLFwia2ppXCIsXCJrampcIixcImtqa1wiLFwia2psXCIsXCJram1cIixcImtqblwiLFwia2pvXCIsXCJranBcIixcImtqcVwiLFwia2pyXCIsXCJranNcIixcImtqdFwiLFwia2p1XCIsXCJranZcIixcImtqeFwiLFwia2p5XCIsXCJranpcIixcImtrYVwiLFwia2tiXCIsXCJra2NcIixcImtrZFwiLFwia2tlXCIsXCJra2ZcIixcImtrZ1wiLFwia2toXCIsXCJra2lcIixcImtralwiLFwia2trXCIsXCJra2xcIixcImtrbVwiLFwia2tuXCIsXCJra29cIixcImtrcFwiLFwia2txXCIsXCJra3JcIixcImtrc1wiLFwia2t0XCIsXCJra3VcIixcImtrdlwiLFwia2t3XCIsXCJra3hcIixcImtreVwiLFwia2t6XCIsXCJrbGFcIixcImtsYlwiLFwia2xjXCIsXCJrbGRcIixcImtsZVwiLFwia2xmXCIsXCJrbGdcIixcImtsaFwiLFwia2xpXCIsXCJrbGpcIixcImtsa1wiLFwia2xsXCIsXCJrbG1cIixcImtsblwiLFwia2xvXCIsXCJrbHBcIixcImtscVwiLFwia2xyXCIsXCJrbHNcIixcImtsdFwiLFwia2x1XCIsXCJrbHZcIixcImtsd1wiLFwia2x4XCIsXCJrbHlcIixcImtselwiLFwia21hXCIsXCJrbWJcIixcImttY1wiLFwia21kXCIsXCJrbWVcIixcImttZlwiLFwia21nXCIsXCJrbWhcIixcImttaVwiLFwia21qXCIsXCJrbWtcIixcImttbFwiLFwia21tXCIsXCJrbW5cIixcImttb1wiLFwia21wXCIsXCJrbXFcIixcImttclwiLFwia21zXCIsXCJrbXRcIixcImttdVwiLFwia212XCIsXCJrbXdcIixcImtteFwiLFwia215XCIsXCJrbXpcIixcImtuYVwiLFwia25iXCIsXCJrbmNcIixcImtuZFwiLFwia25lXCIsXCJrbmZcIixcImtuZ1wiLFwia25pXCIsXCJrbmpcIixcImtua1wiLFwia25sXCIsXCJrbm1cIixcImtublwiLFwia25vXCIsXCJrbnBcIixcImtucVwiLFwia25yXCIsXCJrbnNcIixcImtudFwiLFwia251XCIsXCJrbnZcIixcImtud1wiLFwia254XCIsXCJrbnlcIixcImtuelwiLFwia29hXCIsXCJrb2NcIixcImtvZFwiLFwia29lXCIsXCJrb2ZcIixcImtvZ1wiLFwia29oXCIsXCJrb2lcIixcImtvalwiLFwia29rXCIsXCJrb2xcIixcImtvb1wiLFwia29wXCIsXCJrb3FcIixcImtvc1wiLFwia290XCIsXCJrb3VcIixcImtvdlwiLFwia293XCIsXCJrb3hcIixcImtveVwiLFwia296XCIsXCJrcGFcIixcImtwYlwiLFwia3BjXCIsXCJrcGRcIixcImtwZVwiLFwia3BmXCIsXCJrcGdcIixcImtwaFwiLFwia3BpXCIsXCJrcGpcIixcImtwa1wiLFwia3BsXCIsXCJrcG1cIixcImtwblwiLFwia3BvXCIsXCJrcHBcIixcImtwcVwiLFwia3ByXCIsXCJrcHNcIixcImtwdFwiLFwia3B1XCIsXCJrcHZcIixcImtwd1wiLFwia3B4XCIsXCJrcHlcIixcImtwelwiLFwia3FhXCIsXCJrcWJcIixcImtxY1wiLFwia3FkXCIsXCJrcWVcIixcImtxZlwiLFwia3FnXCIsXCJrcWhcIixcImtxaVwiLFwia3FqXCIsXCJrcWtcIixcImtxbFwiLFwia3FtXCIsXCJrcW5cIixcImtxb1wiLFwia3FwXCIsXCJrcXFcIixcImtxclwiLFwia3FzXCIsXCJrcXRcIixcImtxdVwiLFwia3F2XCIsXCJrcXdcIixcImtxeFwiLFwia3F5XCIsXCJrcXpcIixcImtyYVwiLFwia3JiXCIsXCJrcmNcIixcImtyZFwiLFwia3JlXCIsXCJrcmZcIixcImtyaFwiLFwia3JpXCIsXCJrcmpcIixcImtya1wiLFwia3JsXCIsXCJrcm1cIixcImtyblwiLFwia3JvXCIsXCJrcnBcIixcImtyclwiLFwia3JzXCIsXCJrcnRcIixcImtydVwiLFwia3J2XCIsXCJrcndcIixcImtyeFwiLFwia3J5XCIsXCJrcnpcIixcImtzYVwiLFwia3NiXCIsXCJrc2NcIixcImtzZFwiLFwia3NlXCIsXCJrc2ZcIixcImtzZ1wiLFwia3NoXCIsXCJrc2lcIixcImtzalwiLFwia3NrXCIsXCJrc2xcIixcImtzbVwiLFwia3NuXCIsXCJrc29cIixcImtzcFwiLFwia3NxXCIsXCJrc3JcIixcImtzc1wiLFwia3N0XCIsXCJrc3VcIixcImtzdlwiLFwia3N3XCIsXCJrc3hcIixcImtzeVwiLFwia3N6XCIsXCJrdGFcIixcImt0YlwiLFwia3RjXCIsXCJrdGRcIixcImt0ZVwiLFwia3RmXCIsXCJrdGdcIixcImt0aFwiLFwia3RpXCIsXCJrdGpcIixcImt0a1wiLFwia3RsXCIsXCJrdG1cIixcImt0blwiLFwia3RvXCIsXCJrdHBcIixcImt0cVwiLFwia3RyXCIsXCJrdHNcIixcImt0dFwiLFwia3R1XCIsXCJrdHZcIixcImt0d1wiLFwia3R4XCIsXCJrdHlcIixcImt0elwiLFwia3ViXCIsXCJrdWNcIixcImt1ZFwiLFwia3VlXCIsXCJrdWZcIixcImt1Z1wiLFwia3VoXCIsXCJrdWlcIixcImt1alwiLFwia3VrXCIsXCJrdWxcIixcImt1bVwiLFwia3VuXCIsXCJrdW9cIixcImt1cFwiLFwia3VxXCIsXCJrdXNcIixcImt1dFwiLFwia3V1XCIsXCJrdXZcIixcImt1d1wiLFwia3V4XCIsXCJrdXlcIixcImt1elwiLFwia3ZhXCIsXCJrdmJcIixcImt2Y1wiLFwia3ZkXCIsXCJrdmVcIixcImt2ZlwiLFwia3ZnXCIsXCJrdmhcIixcImt2aVwiLFwia3ZqXCIsXCJrdmtcIixcImt2bFwiLFwia3ZtXCIsXCJrdm5cIixcImt2b1wiLFwia3ZwXCIsXCJrdnFcIixcImt2clwiLFwia3ZzXCIsXCJrdnRcIixcImt2dVwiLFwia3Z2XCIsXCJrdndcIixcImt2eFwiLFwia3Z5XCIsXCJrdnpcIixcImt3YVwiLFwia3diXCIsXCJrd2NcIixcImt3ZFwiLFwia3dlXCIsXCJrd2ZcIixcImt3Z1wiLFwia3doXCIsXCJrd2lcIixcImt3alwiLFwia3drXCIsXCJrd2xcIixcImt3bVwiLFwia3duXCIsXCJrd29cIixcImt3cFwiLFwia3dxXCIsXCJrd3JcIixcImt3c1wiLFwia3d0XCIsXCJrd3VcIixcImt3dlwiLFwia3d3XCIsXCJrd3hcIixcImt3eVwiLFwia3d6XCIsXCJreGFcIixcImt4YlwiLFwia3hjXCIsXCJreGRcIixcImt4ZVwiLFwia3hmXCIsXCJreGhcIixcImt4aVwiLFwia3hqXCIsXCJreGtcIixcImt4bFwiLFwia3htXCIsXCJreG5cIixcImt4b1wiLFwia3hwXCIsXCJreHFcIixcImt4clwiLFwia3hzXCIsXCJreHRcIixcImt4dVwiLFwia3h2XCIsXCJreHdcIixcImt4eFwiLFwia3h5XCIsXCJreHpcIixcImt5YVwiLFwia3liXCIsXCJreWNcIixcImt5ZFwiLFwia3llXCIsXCJreWZcIixcImt5Z1wiLFwia3loXCIsXCJreWlcIixcImt5alwiLFwia3lrXCIsXCJreWxcIixcImt5bVwiLFwia3luXCIsXCJreW9cIixcImt5cFwiLFwia3lxXCIsXCJreXJcIixcImt5c1wiLFwia3l0XCIsXCJreXVcIixcImt5dlwiLFwia3l3XCIsXCJreXhcIixcImt5eVwiLFwia3l6XCIsXCJremFcIixcImt6YlwiLFwia3pjXCIsXCJremRcIixcImt6ZVwiLFwia3pmXCIsXCJremdcIixcImt6aFwiLFwia3ppXCIsXCJrempcIixcImt6a1wiLFwia3psXCIsXCJrem1cIixcImt6blwiLFwia3pvXCIsXCJrenBcIixcImt6cVwiLFwia3pyXCIsXCJrenNcIixcImt6dFwiLFwia3p1XCIsXCJrenZcIixcImt6d1wiLFwia3p4XCIsXCJrenlcIixcImt6elwiXVxuLFsgXCJsYVwiLFwibGJcIixcImxnXCIsXCJsaVwiLFwibG5cIixcImxvXCIsXCJsdFwiLFwibHVcIixcImx2XCIsXCJsYWFcIixcImxhYlwiLFwibGFjXCIsXCJsYWRcIixcImxhZVwiLFwibGFmXCIsXCJsYWdcIixcImxhaFwiLFwibGFpXCIsXCJsYWpcIixcImxha1wiLFwibGFsXCIsXCJsYW1cIixcImxhblwiLFwibGFwXCIsXCJsYXFcIixcImxhclwiLFwibGFzXCIsXCJsYXVcIixcImxhd1wiLFwibGF4XCIsXCJsYXlcIixcImxhelwiLFwibGJhXCIsXCJsYmJcIixcImxiY1wiLFwibGJlXCIsXCJsYmZcIixcImxiZ1wiLFwibGJpXCIsXCJsYmpcIixcImxia1wiLFwibGJsXCIsXCJsYm1cIixcImxiblwiLFwibGJvXCIsXCJsYnFcIixcImxiclwiLFwibGJzXCIsXCJsYnRcIixcImxidVwiLFwibGJ2XCIsXCJsYndcIixcImxieFwiLFwibGJ5XCIsXCJsYnpcIixcImxjY1wiLFwibGNkXCIsXCJsY2VcIixcImxjZlwiLFwibGNoXCIsXCJsY2xcIixcImxjbVwiLFwibGNwXCIsXCJsY3FcIixcImxjc1wiLFwibGRhXCIsXCJsZGJcIixcImxkZFwiLFwibGRnXCIsXCJsZGhcIixcImxkaVwiLFwibGRqXCIsXCJsZGtcIixcImxkbFwiLFwibGRtXCIsXCJsZG5cIixcImxkb1wiLFwibGRwXCIsXCJsZHFcIixcImxlYVwiLFwibGViXCIsXCJsZWNcIixcImxlZFwiLFwibGVlXCIsXCJsZWZcIixcImxlZ1wiLFwibGVoXCIsXCJsZWlcIixcImxlalwiLFwibGVrXCIsXCJsZWxcIixcImxlbVwiLFwibGVuXCIsXCJsZW9cIixcImxlcFwiLFwibGVxXCIsXCJsZXJcIixcImxlc1wiLFwibGV0XCIsXCJsZXVcIixcImxldlwiLFwibGV3XCIsXCJsZXhcIixcImxleVwiLFwibGV6XCIsXCJsZmFcIixcImxmblwiLFwibGdhXCIsXCJsZ2JcIixcImxnZ1wiLFwibGdoXCIsXCJsZ2lcIixcImxna1wiLFwibGdsXCIsXCJsZ21cIixcImxnblwiLFwibGdxXCIsXCJsZ3JcIixcImxndFwiLFwibGd1XCIsXCJsZ3pcIixcImxoYVwiLFwibGhoXCIsXCJsaGlcIixcImxobFwiLFwibGhtXCIsXCJsaG5cIixcImxocFwiLFwibGhzXCIsXCJsaHRcIixcImxodVwiLFwibGlhXCIsXCJsaWJcIixcImxpY1wiLFwibGlkXCIsXCJsaWVcIixcImxpZlwiLFwibGlnXCIsXCJsaWhcIixcImxpaVwiLFwibGlqXCIsXCJsaWtcIixcImxpbFwiLFwibGlvXCIsXCJsaXBcIixcImxpcVwiLFwibGlyXCIsXCJsaXNcIixcImxpdVwiLFwibGl2XCIsXCJsaXdcIixcImxpeFwiLFwibGl5XCIsXCJsaXpcIixcImxqYVwiLFwibGplXCIsXCJsamlcIixcImxqbFwiLFwibGpwXCIsXCJsandcIixcImxqeFwiLFwibGthXCIsXCJsa2JcIixcImxrY1wiLFwibGtkXCIsXCJsa2VcIixcImxraFwiLFwibGtpXCIsXCJsa2pcIixcImxrbFwiLFwibGttXCIsXCJsa25cIixcImxrb1wiLFwibGtyXCIsXCJsa3NcIixcImxrdFwiLFwibGt1XCIsXCJsa3lcIixcImxsYVwiLFwibGxiXCIsXCJsbGNcIixcImxsZFwiLFwibGxlXCIsXCJsbGZcIixcImxsZ1wiLFwibGxoXCIsXCJsbGlcIixcImxsalwiLFwibGxrXCIsXCJsbGxcIixcImxsbVwiLFwibGxuXCIsXCJsbG9cIixcImxscFwiLFwibGxxXCIsXCJsbHNcIixcImxsdVwiLFwibGx4XCIsXCJsbWFcIixcImxtYlwiLFwibG1jXCIsXCJsbWRcIixcImxtZVwiLFwibG1mXCIsXCJsbWdcIixcImxtaFwiLFwibG1pXCIsXCJsbWpcIixcImxta1wiLFwibG1sXCIsXCJsbW1cIixcImxtblwiLFwibG1vXCIsXCJsbXBcIixcImxtcVwiLFwibG1yXCIsXCJsbXVcIixcImxtdlwiLFwibG13XCIsXCJsbXhcIixcImxteVwiLFwibG16XCIsXCJsbmFcIixcImxuYlwiLFwibG5kXCIsXCJsbmdcIixcImxuaFwiLFwibG5pXCIsXCJsbmpcIixcImxubFwiLFwibG5tXCIsXCJsbm5cIixcImxub1wiLFwibG5zXCIsXCJsbnVcIixcImxud1wiLFwibG56XCIsXCJsb2FcIixcImxvYlwiLFwibG9jXCIsXCJsb2VcIixcImxvZlwiLFwibG9nXCIsXCJsb2hcIixcImxvaVwiLFwibG9qXCIsXCJsb2tcIixcImxvbFwiLFwibG9tXCIsXCJsb25cIixcImxvb1wiLFwibG9wXCIsXCJsb3FcIixcImxvclwiLFwibG9zXCIsXCJsb3RcIixcImxvdVwiLFwibG92XCIsXCJsb3dcIixcImxveFwiLFwibG95XCIsXCJsb3pcIixcImxwYVwiLFwibHBlXCIsXCJscG5cIixcImxwb1wiLFwibHB4XCIsXCJscmFcIixcImxyY1wiLFwibHJlXCIsXCJscmdcIixcImxyaVwiLFwibHJrXCIsXCJscmxcIixcImxybVwiLFwibHJuXCIsXCJscm9cIixcImxyclwiLFwibHJ0XCIsXCJscnZcIixcImxyelwiLFwibHNhXCIsXCJsc2JcIixcImxzZFwiLFwibHNlXCIsXCJsc2dcIixcImxzaFwiLFwibHNpXCIsXCJsc2xcIixcImxzbVwiLFwibHNuXCIsXCJsc29cIixcImxzcFwiLFwibHNyXCIsXCJsc3NcIixcImxzdFwiLFwibHN2XCIsXCJsc3lcIixcImx0Y1wiLFwibHRnXCIsXCJsdGhcIixcImx0aVwiLFwibHRuXCIsXCJsdG9cIixcImx0c1wiLFwibHR1XCIsXCJsdWFcIixcImx1Y1wiLFwibHVkXCIsXCJsdWVcIixcImx1ZlwiLFwibHVpXCIsXCJsdWpcIixcImx1a1wiLFwibHVsXCIsXCJsdW1cIixcImx1blwiLFwibHVvXCIsXCJsdXBcIixcImx1cVwiLFwibHVyXCIsXCJsdXNcIixcImx1dFwiLFwibHV1XCIsXCJsdXZcIixcImx1d1wiLFwibHV5XCIsXCJsdXpcIixcImx2YVwiLFwibHZpXCIsXCJsdmtcIixcImx2c1wiLFwibHZ1XCIsXCJsd2FcIixcImx3ZVwiLFwibHdnXCIsXCJsd2hcIixcImx3bFwiLFwibHdtXCIsXCJsd29cIixcImx3c1wiLFwibHd0XCIsXCJsd3VcIixcImx3d1wiLFwibHhtXCIsXCJseWFcIixcImx5Z1wiLFwibHluXCIsXCJsemhcIixcImx6bFwiLFwibHpuXCIsXCJsenpcIl1cbixbIFwibWdcIixcIm1oXCIsXCJtaVwiLFwibWtcIixcIm1sXCIsXCJtblwiLFwibW9cIixcIm1yXCIsXCJtc1wiLFwibXRcIixcIm15XCIsXCJtYWFcIixcIm1hYlwiLFwibWFkXCIsXCJtYWVcIixcIm1hZlwiLFwibWFnXCIsXCJtYWlcIixcIm1halwiLFwibWFrXCIsXCJtYW1cIixcIm1hblwiLFwibWFwXCIsXCJtYXFcIixcIm1hc1wiLFwibWF0XCIsXCJtYXVcIixcIm1hdlwiLFwibWF3XCIsXCJtYXhcIixcIm1helwiLFwibWJhXCIsXCJtYmJcIixcIm1iY1wiLFwibWJkXCIsXCJtYmVcIixcIm1iZlwiLFwibWJoXCIsXCJtYmlcIixcIm1ialwiLFwibWJrXCIsXCJtYmxcIixcIm1ibVwiLFwibWJuXCIsXCJtYm9cIixcIm1icFwiLFwibWJxXCIsXCJtYnJcIixcIm1ic1wiLFwibWJ0XCIsXCJtYnVcIixcIm1idlwiLFwibWJ3XCIsXCJtYnhcIixcIm1ieVwiLFwibWJ6XCIsXCJtY2FcIixcIm1jYlwiLFwibWNjXCIsXCJtY2RcIixcIm1jZVwiLFwibWNmXCIsXCJtY2dcIixcIm1jaFwiLFwibWNpXCIsXCJtY2pcIixcIm1ja1wiLFwibWNsXCIsXCJtY21cIixcIm1jblwiLFwibWNvXCIsXCJtY3BcIixcIm1jcVwiLFwibWNyXCIsXCJtY3NcIixcIm1jdFwiLFwibWN1XCIsXCJtY3ZcIixcIm1jd1wiLFwibWN4XCIsXCJtY3lcIixcIm1jelwiLFwibWRhXCIsXCJtZGJcIixcIm1kY1wiLFwibWRkXCIsXCJtZGVcIixcIm1kZlwiLFwibWRnXCIsXCJtZGhcIixcIm1kaVwiLFwibWRqXCIsXCJtZGtcIixcIm1kbFwiLFwibWRtXCIsXCJtZG5cIixcIm1kcFwiLFwibWRxXCIsXCJtZHJcIixcIm1kc1wiLFwibWR0XCIsXCJtZHVcIixcIm1kdlwiLFwibWR3XCIsXCJtZHhcIixcIm1keVwiLFwibWR6XCIsXCJtZWFcIixcIm1lYlwiLFwibWVjXCIsXCJtZWRcIixcIm1lZVwiLFwibWVmXCIsXCJtZWdcIixcIm1laFwiLFwibWVpXCIsXCJtZWpcIixcIm1la1wiLFwibWVsXCIsXCJtZW1cIixcIm1lblwiLFwibWVvXCIsXCJtZXBcIixcIm1lcVwiLFwibWVyXCIsXCJtZXNcIixcIm1ldFwiLFwibWV1XCIsXCJtZXZcIixcIm1ld1wiLFwibWV5XCIsXCJtZXpcIixcIm1mYVwiLFwibWZiXCIsXCJtZmNcIixcIm1mZFwiLFwibWZlXCIsXCJtZmZcIixcIm1mZ1wiLFwibWZoXCIsXCJtZmlcIixcIm1malwiLFwibWZrXCIsXCJtZmxcIixcIm1mbVwiLFwibWZuXCIsXCJtZm9cIixcIm1mcFwiLFwibWZxXCIsXCJtZnJcIixcIm1mc1wiLFwibWZ0XCIsXCJtZnVcIixcIm1mdlwiLFwibWZ3XCIsXCJtZnhcIixcIm1meVwiLFwibWZ6XCIsXCJtZ2FcIixcIm1nYlwiLFwibWdjXCIsXCJtZ2RcIixcIm1nZVwiLFwibWdmXCIsXCJtZ2dcIixcIm1naFwiLFwibWdpXCIsXCJtZ2pcIixcIm1na1wiLFwibWdsXCIsXCJtZ21cIixcIm1nblwiLFwibWdvXCIsXCJtZ3BcIixcIm1ncVwiLFwibWdyXCIsXCJtZ3NcIixcIm1ndFwiLFwibWd1XCIsXCJtZ3ZcIixcIm1nd1wiLFwibWd4XCIsXCJtZ3lcIixcIm1nelwiLFwibWhhXCIsXCJtaGJcIixcIm1oY1wiLFwibWhkXCIsXCJtaGVcIixcIm1oZlwiLFwibWhnXCIsXCJtaGhcIixcIm1oaVwiLFwibWhqXCIsXCJtaGtcIixcIm1obFwiLFwibWhtXCIsXCJtaG5cIixcIm1ob1wiLFwibWhwXCIsXCJtaHFcIixcIm1oclwiLFwibWhzXCIsXCJtaHRcIixcIm1odVwiLFwibWh3XCIsXCJtaHhcIixcIm1oeVwiLFwibWh6XCIsXCJtaWFcIixcIm1pYlwiLFwibWljXCIsXCJtaWRcIixcIm1pZVwiLFwibWlmXCIsXCJtaWdcIixcIm1paFwiLFwibWlpXCIsXCJtaWpcIixcIm1pa1wiLFwibWlsXCIsXCJtaW1cIixcIm1pblwiLFwibWlvXCIsXCJtaXBcIixcIm1pcVwiLFwibWlyXCIsXCJtaXNcIixcIm1pdFwiLFwibWl1XCIsXCJtaXdcIixcIm1peFwiLFwibWl5XCIsXCJtaXpcIixcIm1qYVwiLFwibWpiXCIsXCJtamNcIixcIm1qZFwiLFwibWplXCIsXCJtamdcIixcIm1qaFwiLFwibWppXCIsXCJtampcIixcIm1qa1wiLFwibWpsXCIsXCJtam1cIixcIm1qblwiLFwibWpvXCIsXCJtanBcIixcIm1qcVwiLFwibWpyXCIsXCJtanNcIixcIm1qdFwiLFwibWp1XCIsXCJtanZcIixcIm1qd1wiLFwibWp4XCIsXCJtanlcIixcIm1qelwiLFwibWthXCIsXCJta2JcIixcIm1rY1wiLFwibWtlXCIsXCJta2ZcIixcIm1rZ1wiLFwibWtoXCIsXCJta2lcIixcIm1ralwiLFwibWtrXCIsXCJta2xcIixcIm1rbVwiLFwibWtuXCIsXCJta29cIixcIm1rcFwiLFwibWtxXCIsXCJta3JcIixcIm1rc1wiLFwibWt0XCIsXCJta3VcIixcIm1rdlwiLFwibWt3XCIsXCJta3hcIixcIm1reVwiLFwibWt6XCIsXCJtbGFcIixcIm1sYlwiLFwibWxjXCIsXCJtbGRcIixcIm1sZVwiLFwibWxmXCIsXCJtbGhcIixcIm1saVwiLFwibWxqXCIsXCJtbGtcIixcIm1sbFwiLFwibWxtXCIsXCJtbG5cIixcIm1sb1wiLFwibWxwXCIsXCJtbHFcIixcIm1sclwiLFwibWxzXCIsXCJtbHVcIixcIm1sdlwiLFwibWx3XCIsXCJtbHhcIixcIm1selwiLFwibW1hXCIsXCJtbWJcIixcIm1tY1wiLFwibW1kXCIsXCJtbWVcIixcIm1tZlwiLFwibW1nXCIsXCJtbWhcIixcIm1taVwiLFwibW1qXCIsXCJtbWtcIixcIm1tbFwiLFwibW1tXCIsXCJtbW5cIixcIm1tb1wiLFwibW1wXCIsXCJtbXFcIixcIm1tclwiLFwibW10XCIsXCJtbXVcIixcIm1tdlwiLFwibW13XCIsXCJtbXhcIixcIm1teVwiLFwibW16XCIsXCJtbmFcIixcIm1uYlwiLFwibW5jXCIsXCJtbmRcIixcIm1uZVwiLFwibW5mXCIsXCJtbmdcIixcIm1uaFwiLFwibW5pXCIsXCJtbmpcIixcIm1ua1wiLFwibW5sXCIsXCJtbm1cIixcIm1ublwiLFwibW5vXCIsXCJtbnBcIixcIm1ucVwiLFwibW5yXCIsXCJtbnNcIixcIm1udFwiLFwibW51XCIsXCJtbnZcIixcIm1ud1wiLFwibW54XCIsXCJtbnlcIixcIm1uelwiLFwibW9hXCIsXCJtb2NcIixcIm1vZFwiLFwibW9lXCIsXCJtb2ZcIixcIm1vZ1wiLFwibW9oXCIsXCJtb2lcIixcIm1valwiLFwibW9rXCIsXCJtb21cIixcIm1vb1wiLFwibW9wXCIsXCJtb3FcIixcIm1vclwiLFwibW9zXCIsXCJtb3RcIixcIm1vdVwiLFwibW92XCIsXCJtb3dcIixcIm1veFwiLFwibW95XCIsXCJtb3pcIixcIm1wYVwiLFwibXBiXCIsXCJtcGNcIixcIm1wZFwiLFwibXBlXCIsXCJtcGdcIixcIm1waFwiLFwibXBpXCIsXCJtcGpcIixcIm1wa1wiLFwibXBsXCIsXCJtcG1cIixcIm1wblwiLFwibXBvXCIsXCJtcHBcIixcIm1wcVwiLFwibXByXCIsXCJtcHNcIixcIm1wdFwiLFwibXB1XCIsXCJtcHZcIixcIm1wd1wiLFwibXB4XCIsXCJtcHlcIixcIm1welwiLFwibXFhXCIsXCJtcWJcIixcIm1xY1wiLFwibXFlXCIsXCJtcWZcIixcIm1xZ1wiLFwibXFoXCIsXCJtcWlcIixcIm1xalwiLFwibXFrXCIsXCJtcWxcIixcIm1xbVwiLFwibXFuXCIsXCJtcW9cIixcIm1xcFwiLFwibXFxXCIsXCJtcXJcIixcIm1xc1wiLFwibXF0XCIsXCJtcXVcIixcIm1xdlwiLFwibXF3XCIsXCJtcXhcIixcIm1xeVwiLFwibXF6XCIsXCJtcmFcIixcIm1yYlwiLFwibXJjXCIsXCJtcmRcIixcIm1yZVwiLFwibXJmXCIsXCJtcmdcIixcIm1yaFwiLFwibXJqXCIsXCJtcmtcIixcIm1ybFwiLFwibXJtXCIsXCJtcm5cIixcIm1yb1wiLFwibXJwXCIsXCJtcnFcIixcIm1yclwiLFwibXJzXCIsXCJtcnRcIixcIm1ydVwiLFwibXJ2XCIsXCJtcndcIixcIm1yeFwiLFwibXJ5XCIsXCJtcnpcIixcIm1zYlwiLFwibXNjXCIsXCJtc2RcIixcIm1zZVwiLFwibXNmXCIsXCJtc2dcIixcIm1zaFwiLFwibXNpXCIsXCJtc2pcIixcIm1za1wiLFwibXNsXCIsXCJtc21cIixcIm1zblwiLFwibXNvXCIsXCJtc3BcIixcIm1zcVwiLFwibXNyXCIsXCJtc3NcIixcIm1zdFwiLFwibXN1XCIsXCJtc3ZcIixcIm1zd1wiLFwibXN4XCIsXCJtc3lcIixcIm1zelwiLFwibXRhXCIsXCJtdGJcIixcIm10Y1wiLFwibXRkXCIsXCJtdGVcIixcIm10ZlwiLFwibXRnXCIsXCJtdGhcIixcIm10aVwiLFwibXRqXCIsXCJtdGtcIixcIm10bFwiLFwibXRtXCIsXCJtdG5cIixcIm10b1wiLFwibXRwXCIsXCJtdHFcIixcIm10clwiLFwibXRzXCIsXCJtdHRcIixcIm10dVwiLFwibXR2XCIsXCJtdHdcIixcIm10eFwiLFwibXR5XCIsXCJtdWFcIixcIm11YlwiLFwibXVjXCIsXCJtdWRcIixcIm11ZVwiLFwibXVnXCIsXCJtdWhcIixcIm11aVwiLFwibXVqXCIsXCJtdWtcIixcIm11bFwiLFwibXVtXCIsXCJtdW5cIixcIm11b1wiLFwibXVwXCIsXCJtdXFcIixcIm11clwiLFwibXVzXCIsXCJtdXRcIixcIm11dVwiLFwibXV2XCIsXCJtdXhcIixcIm11eVwiLFwibXV6XCIsXCJtdmFcIixcIm12YlwiLFwibXZkXCIsXCJtdmVcIixcIm12ZlwiLFwibXZnXCIsXCJtdmhcIixcIm12aVwiLFwibXZrXCIsXCJtdmxcIixcIm12bVwiLFwibXZuXCIsXCJtdm9cIixcIm12cFwiLFwibXZxXCIsXCJtdnJcIixcIm12c1wiLFwibXZ0XCIsXCJtdnVcIixcIm12dlwiLFwibXZ3XCIsXCJtdnhcIixcIm12eVwiLFwibXZ6XCIsXCJtd2FcIixcIm13YlwiLFwibXdjXCIsXCJtd2RcIixcIm13ZVwiLFwibXdmXCIsXCJtd2dcIixcIm13aFwiLFwibXdpXCIsXCJtd2pcIixcIm13a1wiLFwibXdsXCIsXCJtd21cIixcIm13blwiLFwibXdvXCIsXCJtd3BcIixcIm13cVwiLFwibXdyXCIsXCJtd3NcIixcIm13dFwiLFwibXd1XCIsXCJtd3ZcIixcIm13d1wiLFwibXd4XCIsXCJtd3lcIixcIm13elwiLFwibXhhXCIsXCJteGJcIixcIm14Y1wiLFwibXhkXCIsXCJteGVcIixcIm14ZlwiLFwibXhnXCIsXCJteGhcIixcIm14aVwiLFwibXhqXCIsXCJteGtcIixcIm14bFwiLFwibXhtXCIsXCJteG5cIixcIm14b1wiLFwibXhwXCIsXCJteHFcIixcIm14clwiLFwibXhzXCIsXCJteHRcIixcIm14dVwiLFwibXh2XCIsXCJteHdcIixcIm14eFwiLFwibXh5XCIsXCJteHpcIixcIm15YlwiLFwibXljXCIsXCJteWRcIixcIm15ZVwiLFwibXlmXCIsXCJteWdcIixcIm15aFwiLFwibXlpXCIsXCJteWpcIixcIm15a1wiLFwibXlsXCIsXCJteW1cIixcIm15blwiLFwibXlvXCIsXCJteXBcIixcIm15cVwiLFwibXlyXCIsXCJteXNcIixcIm15dFwiLFwibXl1XCIsXCJteXZcIixcIm15d1wiLFwibXl4XCIsXCJteXlcIixcIm15elwiLFwibXphXCIsXCJtemJcIixcIm16Y1wiLFwibXpkXCIsXCJtemVcIixcIm16Z1wiLFwibXpoXCIsXCJtemlcIixcIm16alwiLFwibXprXCIsXCJtemxcIixcIm16bVwiLFwibXpuXCIsXCJtem9cIixcIm16cFwiLFwibXpxXCIsXCJtenJcIixcIm16c1wiLFwibXp0XCIsXCJtenVcIixcIm16dlwiLFwibXp3XCIsXCJtenhcIixcIm16eVwiLFwibXp6XCJdXG4sWyBcIm5hXCIsXCJuYlwiLFwibmRcIixcIm5lXCIsXCJuZ1wiLFwibmxcIixcIm5uXCIsXCJub1wiLFwibnJcIixcIm52XCIsXCJueVwiLFwibmFhXCIsXCJuYWJcIixcIm5hY1wiLFwibmFkXCIsXCJuYWVcIixcIm5hZlwiLFwibmFnXCIsXCJuYWhcIixcIm5haVwiLFwibmFqXCIsXCJuYWtcIixcIm5hbFwiLFwibmFtXCIsXCJuYW5cIixcIm5hb1wiLFwibmFwXCIsXCJuYXFcIixcIm5hclwiLFwibmFzXCIsXCJuYXRcIixcIm5hd1wiLFwibmF4XCIsXCJuYXlcIixcIm5helwiLFwibmJhXCIsXCJuYmJcIixcIm5iY1wiLFwibmJkXCIsXCJuYmVcIixcIm5iZlwiLFwibmJnXCIsXCJuYmhcIixcIm5iaVwiLFwibmJqXCIsXCJuYmtcIixcIm5ibVwiLFwibmJuXCIsXCJuYm9cIixcIm5icFwiLFwibmJxXCIsXCJuYnJcIixcIm5ic1wiLFwibmJ0XCIsXCJuYnVcIixcIm5idlwiLFwibmJ3XCIsXCJuYnhcIixcIm5ieVwiLFwibmNhXCIsXCJuY2JcIixcIm5jY1wiLFwibmNkXCIsXCJuY2VcIixcIm5jZlwiLFwibmNnXCIsXCJuY2hcIixcIm5jaVwiLFwibmNqXCIsXCJuY2tcIixcIm5jbFwiLFwibmNtXCIsXCJuY25cIixcIm5jb1wiLFwibmNwXCIsXCJuY3FcIixcIm5jclwiLFwibmNzXCIsXCJuY3RcIixcIm5jdVwiLFwibmN4XCIsXCJuY3pcIixcIm5kYVwiLFwibmRiXCIsXCJuZGNcIixcIm5kZFwiLFwibmRmXCIsXCJuZGdcIixcIm5kaFwiLFwibmRpXCIsXCJuZGpcIixcIm5ka1wiLFwibmRsXCIsXCJuZG1cIixcIm5kblwiLFwibmRwXCIsXCJuZHFcIixcIm5kclwiLFwibmRzXCIsXCJuZHRcIixcIm5kdVwiLFwibmR2XCIsXCJuZHdcIixcIm5keFwiLFwibmR5XCIsXCJuZHpcIixcIm5lYVwiLFwibmViXCIsXCJuZWNcIixcIm5lZFwiLFwibmVlXCIsXCJuZWZcIixcIm5lZ1wiLFwibmVoXCIsXCJuZWlcIixcIm5lalwiLFwibmVrXCIsXCJuZW1cIixcIm5lblwiLFwibmVvXCIsXCJuZXFcIixcIm5lclwiLFwibmVzXCIsXCJuZXRcIixcIm5ldVwiLFwibmV2XCIsXCJuZXdcIixcIm5leFwiLFwibmV5XCIsXCJuZXpcIixcIm5mYVwiLFwibmZkXCIsXCJuZmxcIixcIm5mclwiLFwibmZ1XCIsXCJuZ2FcIixcIm5nYlwiLFwibmdjXCIsXCJuZ2RcIixcIm5nZVwiLFwibmdmXCIsXCJuZ2dcIixcIm5naFwiLFwibmdpXCIsXCJuZ2pcIixcIm5na1wiLFwibmdsXCIsXCJuZ21cIixcIm5nblwiLFwibmdvXCIsXCJuZ3BcIixcIm5ncVwiLFwibmdyXCIsXCJuZ3NcIixcIm5ndFwiLFwibmd1XCIsXCJuZ3ZcIixcIm5nd1wiLFwibmd4XCIsXCJuZ3lcIixcIm5nelwiLFwibmhhXCIsXCJuaGJcIixcIm5oY1wiLFwibmhkXCIsXCJuaGVcIixcIm5oZlwiLFwibmhnXCIsXCJuaGhcIixcIm5oaVwiLFwibmhrXCIsXCJuaG1cIixcIm5oblwiLFwibmhvXCIsXCJuaHBcIixcIm5ocVwiLFwibmhyXCIsXCJuaHRcIixcIm5odVwiLFwibmh2XCIsXCJuaHdcIixcIm5oeFwiLFwibmh5XCIsXCJuaHpcIixcIm5pYVwiLFwibmliXCIsXCJuaWNcIixcIm5pZFwiLFwibmllXCIsXCJuaWZcIixcIm5pZ1wiLFwibmloXCIsXCJuaWlcIixcIm5palwiLFwibmlrXCIsXCJuaWxcIixcIm5pbVwiLFwibmluXCIsXCJuaW9cIixcIm5pcVwiLFwibmlyXCIsXCJuaXNcIixcIm5pdFwiLFwibml1XCIsXCJuaXZcIixcIm5pd1wiLFwibml4XCIsXCJuaXlcIixcIm5pelwiLFwibmphXCIsXCJuamJcIixcIm5qZFwiLFwibmpoXCIsXCJuamlcIixcIm5qalwiLFwibmpsXCIsXCJuam1cIixcIm5qblwiLFwibmpvXCIsXCJuanJcIixcIm5qc1wiLFwibmp0XCIsXCJuanVcIixcIm5qeFwiLFwibmp5XCIsXCJuanpcIixcIm5rYVwiLFwibmtiXCIsXCJua2NcIixcIm5rZFwiLFwibmtlXCIsXCJua2ZcIixcIm5rZ1wiLFwibmtoXCIsXCJua2lcIixcIm5ralwiLFwibmtrXCIsXCJua21cIixcIm5rblwiLFwibmtvXCIsXCJua3BcIixcIm5rcVwiLFwibmtyXCIsXCJua3NcIixcIm5rdFwiLFwibmt1XCIsXCJua3ZcIixcIm5rd1wiLFwibmt4XCIsXCJua3pcIixcIm5sYVwiLFwibmxjXCIsXCJubGVcIixcIm5sZ1wiLFwibmxpXCIsXCJubGpcIixcIm5sa1wiLFwibmxsXCIsXCJubG1cIixcIm5sblwiLFwibmxvXCIsXCJubHFcIixcIm5sclwiLFwibmx1XCIsXCJubHZcIixcIm5sd1wiLFwibmx4XCIsXCJubHlcIixcIm5selwiLFwibm1hXCIsXCJubWJcIixcIm5tY1wiLFwibm1kXCIsXCJubWVcIixcIm5tZlwiLFwibm1nXCIsXCJubWhcIixcIm5taVwiLFwibm1qXCIsXCJubWtcIixcIm5tbFwiLFwibm1tXCIsXCJubW5cIixcIm5tb1wiLFwibm1wXCIsXCJubXFcIixcIm5tclwiLFwibm1zXCIsXCJubXRcIixcIm5tdVwiLFwibm12XCIsXCJubXdcIixcIm5teFwiLFwibm15XCIsXCJubXpcIixcIm5uYVwiLFwibm5iXCIsXCJubmNcIixcIm5uZFwiLFwibm5lXCIsXCJubmZcIixcIm5uZ1wiLFwibm5oXCIsXCJubmlcIixcIm5ualwiLFwibm5rXCIsXCJubmxcIixcIm5ubVwiLFwibm5uXCIsXCJubnBcIixcIm5ucVwiLFwibm5yXCIsXCJubnNcIixcIm5udFwiLFwibm51XCIsXCJubnZcIixcIm5ud1wiLFwibm54XCIsXCJubnlcIixcIm5uelwiLFwibm9hXCIsXCJub2NcIixcIm5vZFwiLFwibm9lXCIsXCJub2ZcIixcIm5vZ1wiLFwibm9oXCIsXCJub2lcIixcIm5valwiLFwibm9rXCIsXCJub2xcIixcIm5vbVwiLFwibm9uXCIsXCJub29cIixcIm5vcFwiLFwibm9xXCIsXCJub3NcIixcIm5vdFwiLFwibm91XCIsXCJub3ZcIixcIm5vd1wiLFwibm95XCIsXCJub3pcIixcIm5wYVwiLFwibnBiXCIsXCJucGdcIixcIm5waFwiLFwibnBpXCIsXCJucGxcIixcIm5wblwiLFwibnBvXCIsXCJucHNcIixcIm5wdVwiLFwibnB4XCIsXCJucHlcIixcIm5xZ1wiLFwibnFrXCIsXCJucWxcIixcIm5xbVwiLFwibnFuXCIsXCJucW9cIixcIm5xcVwiLFwibnF0XCIsXCJucXlcIixcIm5yYVwiLFwibnJiXCIsXCJucmNcIixcIm5yZVwiLFwibnJmXCIsXCJucmdcIixcIm5yaVwiLFwibnJrXCIsXCJucmxcIixcIm5ybVwiLFwibnJuXCIsXCJucnBcIixcIm5yclwiLFwibnJ0XCIsXCJucnVcIixcIm5yeFwiLFwibnJ6XCIsXCJuc2FcIixcIm5zYlwiLFwibnNjXCIsXCJuc2RcIixcIm5zZVwiLFwibnNmXCIsXCJuc2dcIixcIm5zaFwiLFwibnNpXCIsXCJuc2tcIixcIm5zbFwiLFwibnNtXCIsXCJuc25cIixcIm5zb1wiLFwibnNwXCIsXCJuc3FcIixcIm5zclwiLFwibnNzXCIsXCJuc3RcIixcIm5zdVwiLFwibnN2XCIsXCJuc3dcIixcIm5zeFwiLFwibnN5XCIsXCJuc3pcIixcIm50ZFwiLFwibnRlXCIsXCJudGdcIixcIm50aVwiLFwibnRqXCIsXCJudGtcIixcIm50bVwiLFwibnRvXCIsXCJudHBcIixcIm50clwiLFwibnRzXCIsXCJudHVcIixcIm50d1wiLFwibnR4XCIsXCJudHlcIixcIm50elwiLFwibnVhXCIsXCJudWJcIixcIm51Y1wiLFwibnVkXCIsXCJudWVcIixcIm51ZlwiLFwibnVnXCIsXCJudWhcIixcIm51aVwiLFwibnVqXCIsXCJudWtcIixcIm51bFwiLFwibnVtXCIsXCJudW5cIixcIm51b1wiLFwibnVwXCIsXCJudXFcIixcIm51clwiLFwibnVzXCIsXCJudXRcIixcIm51dVwiLFwibnV2XCIsXCJudXdcIixcIm51eFwiLFwibnV5XCIsXCJudXpcIixcIm52aFwiLFwibnZtXCIsXCJudm9cIixcIm53YVwiLFwibndiXCIsXCJud2NcIixcIm53ZVwiLFwibndnXCIsXCJud2lcIixcIm53bVwiLFwibndvXCIsXCJud3JcIixcIm53eFwiLFwibnd5XCIsXCJueGFcIixcIm54ZFwiLFwibnhlXCIsXCJueGdcIixcIm54aVwiLFwibnhrXCIsXCJueGxcIixcIm54bVwiLFwibnhuXCIsXCJueG9cIixcIm54cVwiLFwibnhyXCIsXCJueHVcIixcIm54eFwiLFwibnliXCIsXCJueWNcIixcIm55ZFwiLFwibnllXCIsXCJueWZcIixcIm55Z1wiLFwibnloXCIsXCJueWlcIixcIm55alwiLFwibnlrXCIsXCJueWxcIixcIm55bVwiLFwibnluXCIsXCJueW9cIixcIm55cFwiLFwibnlxXCIsXCJueXJcIixcIm55c1wiLFwibnl0XCIsXCJueXVcIixcIm55dlwiLFwibnl3XCIsXCJueXhcIixcIm55eVwiLFwibnphXCIsXCJuemJcIixcIm56ZFwiLFwibnppXCIsXCJuemtcIixcIm56bVwiLFwibnpzXCIsXCJuenVcIixcIm56eVwiLFwibnp6XCJdXG4sWyBcIm9jXCIsXCJvalwiLFwib21cIixcIm9yXCIsXCJvc1wiLFwib2FhXCIsXCJvYWNcIixcIm9hclwiLFwib2F2XCIsXCJvYmlcIixcIm9ia1wiLFwib2JsXCIsXCJvYm1cIixcIm9ib1wiLFwib2JyXCIsXCJvYnRcIixcIm9idVwiLFwib2NhXCIsXCJvY2hcIixcIm9jbVwiLFwib2NvXCIsXCJvY3VcIixcIm9kYVwiLFwib2RrXCIsXCJvZHRcIixcIm9kdVwiLFwib2ZvXCIsXCJvZnNcIixcIm9mdVwiLFwib2diXCIsXCJvZ2NcIixcIm9nZVwiLFwib2dnXCIsXCJvZ29cIixcIm9ndVwiLFwib2h0XCIsXCJvaHVcIixcIm9pYVwiLFwib2luXCIsXCJvamJcIixcIm9qY1wiLFwib2pnXCIsXCJvanBcIixcIm9qc1wiLFwib2p2XCIsXCJvandcIixcIm9rYVwiLFwib2tiXCIsXCJva2NcIixcIm9rZFwiLFwib2tlXCIsXCJva2dcIixcIm9raFwiLFwib2tpXCIsXCJva2pcIixcIm9ra1wiLFwib2tsXCIsXCJva21cIixcIm9rblwiLFwib2tvXCIsXCJva3JcIixcIm9rc1wiLFwib2t1XCIsXCJva3ZcIixcIm9reFwiLFwib2t6XCIsXCJvbGFcIixcIm9sZFwiLFwib2xlXCIsXCJvbGtcIixcIm9sbVwiLFwib2xvXCIsXCJvbHJcIixcIm9sdFwiLFwib2x1XCIsXCJvbWFcIixcIm9tYlwiLFwib21jXCIsXCJvbWVcIixcIm9tZ1wiLFwib21pXCIsXCJvbWtcIixcIm9tbFwiLFwib21uXCIsXCJvbW9cIixcIm9tcFwiLFwib21xXCIsXCJvbXJcIixcIm9tdFwiLFwib211XCIsXCJvbXZcIixcIm9td1wiLFwib214XCIsXCJvbXlcIixcIm9uYVwiLFwib25iXCIsXCJvbmVcIixcIm9uZ1wiLFwib25pXCIsXCJvbmpcIixcIm9ua1wiLFwib25uXCIsXCJvbm9cIixcIm9ucFwiLFwib25yXCIsXCJvbnNcIixcIm9udFwiLFwib251XCIsXCJvbndcIixcIm9ueFwiLFwib29kXCIsXCJvb2dcIixcIm9vblwiLFwib29yXCIsXCJvb3NcIixcIm9wYVwiLFwib3BrXCIsXCJvcG1cIixcIm9wb1wiLFwib3B0XCIsXCJvcHlcIixcIm9yYVwiLFwib3JjXCIsXCJvcmVcIixcIm9yZ1wiLFwib3JoXCIsXCJvcm5cIixcIm9yb1wiLFwib3JyXCIsXCJvcnNcIixcIm9ydFwiLFwib3J1XCIsXCJvcnZcIixcIm9yd1wiLFwib3J4XCIsXCJvcnlcIixcIm9yelwiLFwib3NhXCIsXCJvc2NcIixcIm9zaVwiLFwib3NuXCIsXCJvc29cIixcIm9zcFwiLFwib3N0XCIsXCJvc3VcIixcIm9zeFwiLFwib3RhXCIsXCJvdGJcIixcIm90ZFwiLFwib3RlXCIsXCJvdGlcIixcIm90a1wiLFwib3RsXCIsXCJvdG1cIixcIm90blwiLFwib3RvXCIsXCJvdHFcIixcIm90clwiLFwib3RzXCIsXCJvdHRcIixcIm90dVwiLFwib3R3XCIsXCJvdHhcIixcIm90eVwiLFwib3R6XCIsXCJvdWFcIixcIm91YlwiLFwib3VlXCIsXCJvdWlcIixcIm91bVwiLFwib3VuXCIsXCJvdmRcIixcIm93aVwiLFwib3dsXCIsXCJveWJcIixcIm95ZFwiLFwib3ltXCIsXCJveXlcIixcIm96bVwiXVxuLFsgXCJwYVwiLFwicGlcIixcInBsXCIsXCJwc1wiLFwicHRcIixcInBhYVwiLFwicGFiXCIsXCJwYWNcIixcInBhZFwiLFwicGFlXCIsXCJwYWZcIixcInBhZ1wiLFwicGFoXCIsXCJwYWlcIixcInBha1wiLFwicGFsXCIsXCJwYW1cIixcInBhb1wiLFwicGFwXCIsXCJwYXFcIixcInBhclwiLFwicGFzXCIsXCJwYXRcIixcInBhdVwiLFwicGF2XCIsXCJwYXdcIixcInBheFwiLFwicGF5XCIsXCJwYXpcIixcInBiYlwiLFwicGJjXCIsXCJwYmVcIixcInBiZlwiLFwicGJnXCIsXCJwYmhcIixcInBiaVwiLFwicGJsXCIsXCJwYm1cIixcInBiblwiLFwicGJvXCIsXCJwYnBcIixcInBiclwiLFwicGJzXCIsXCJwYnRcIixcInBidVwiLFwicGJ2XCIsXCJwYnlcIixcInBielwiLFwicGNhXCIsXCJwY2JcIixcInBjY1wiLFwicGNkXCIsXCJwY2VcIixcInBjZlwiLFwicGNnXCIsXCJwY2hcIixcInBjaVwiLFwicGNqXCIsXCJwY2tcIixcInBjbFwiLFwicGNtXCIsXCJwY25cIixcInBjcFwiLFwicGNyXCIsXCJwY3dcIixcInBkYVwiLFwicGRjXCIsXCJwZGlcIixcInBkblwiLFwicGRvXCIsXCJwZHRcIixcInBkdVwiLFwicGVhXCIsXCJwZWJcIixcInBlZFwiLFwicGVlXCIsXCJwZWZcIixcInBlZ1wiLFwicGVoXCIsXCJwZWlcIixcInBlalwiLFwicGVrXCIsXCJwZWxcIixcInBlbVwiLFwicGVvXCIsXCJwZXBcIixcInBlcVwiLFwicGVzXCIsXCJwZXZcIixcInBleFwiLFwicGV5XCIsXCJwZXpcIixcInBmYVwiLFwicGZlXCIsXCJwZmxcIixcInBnYVwiLFwicGdkXCIsXCJwZ2dcIixcInBnaVwiLFwicGdrXCIsXCJwZ2xcIixcInBnblwiLFwicGdzXCIsXCJwZ3VcIixcInBneVwiLFwicGd6XCIsXCJwaGFcIixcInBoZFwiLFwicGhnXCIsXCJwaGhcIixcInBoaVwiLFwicGhrXCIsXCJwaGxcIixcInBobVwiLFwicGhuXCIsXCJwaG9cIixcInBocVwiLFwicGhyXCIsXCJwaHRcIixcInBodVwiLFwicGh2XCIsXCJwaHdcIixcInBpYVwiLFwicGliXCIsXCJwaWNcIixcInBpZFwiLFwicGllXCIsXCJwaWZcIixcInBpZ1wiLFwicGloXCIsXCJwaWlcIixcInBpalwiLFwicGlsXCIsXCJwaW1cIixcInBpblwiLFwicGlvXCIsXCJwaXBcIixcInBpclwiLFwicGlzXCIsXCJwaXRcIixcInBpdVwiLFwicGl2XCIsXCJwaXdcIixcInBpeFwiLFwicGl5XCIsXCJwaXpcIixcInBqdFwiLFwicGthXCIsXCJwa2JcIixcInBrY1wiLFwicGtnXCIsXCJwa2hcIixcInBrblwiLFwicGtvXCIsXCJwa3BcIixcInBrclwiLFwicGtzXCIsXCJwa3RcIixcInBrdVwiLFwicGxhXCIsXCJwbGJcIixcInBsY1wiLFwicGxkXCIsXCJwbGVcIixcInBsZlwiLFwicGxnXCIsXCJwbGhcIixcInBsalwiLFwicGxrXCIsXCJwbGxcIixcInBsblwiLFwicGxvXCIsXCJwbHBcIixcInBscVwiLFwicGxyXCIsXCJwbHNcIixcInBsdFwiLFwicGx1XCIsXCJwbHZcIixcInBsd1wiLFwicGx5XCIsXCJwbHpcIixcInBtYVwiLFwicG1iXCIsXCJwbWNcIixcInBtZFwiLFwicG1lXCIsXCJwbWZcIixcInBtaFwiLFwicG1pXCIsXCJwbWpcIixcInBta1wiLFwicG1sXCIsXCJwbW1cIixcInBtblwiLFwicG1vXCIsXCJwbXFcIixcInBtclwiLFwicG1zXCIsXCJwbXRcIixcInBtdVwiLFwicG13XCIsXCJwbXhcIixcInBteVwiLFwicG16XCIsXCJwbmFcIixcInBuYlwiLFwicG5jXCIsXCJwbmRcIixcInBuZVwiLFwicG5nXCIsXCJwbmhcIixcInBuaVwiLFwicG5qXCIsXCJwbmtcIixcInBubFwiLFwicG5tXCIsXCJwbm5cIixcInBub1wiLFwicG5wXCIsXCJwbnFcIixcInBuclwiLFwicG5zXCIsXCJwbnRcIixcInBudVwiLFwicG52XCIsXCJwbndcIixcInBueFwiLFwicG55XCIsXCJwbnpcIixcInBvY1wiLFwicG9kXCIsXCJwb2VcIixcInBvZlwiLFwicG9nXCIsXCJwb2hcIixcInBvaVwiLFwicG9rXCIsXCJwb21cIixcInBvblwiLFwicG9vXCIsXCJwb3BcIixcInBvcVwiLFwicG9zXCIsXCJwb3RcIixcInBvdlwiLFwicG93XCIsXCJwb3hcIixcInBveVwiLFwicG96XCIsXCJwcGFcIixcInBwZVwiLFwicHBpXCIsXCJwcGtcIixcInBwbFwiLFwicHBtXCIsXCJwcG5cIixcInBwb1wiLFwicHBwXCIsXCJwcHFcIixcInBwclwiLFwicHBzXCIsXCJwcHRcIixcInBwdVwiLFwicHFhXCIsXCJwcWVcIixcInBxbVwiLFwicHF3XCIsXCJwcmFcIixcInByYlwiLFwicHJjXCIsXCJwcmRcIixcInByZVwiLFwicHJmXCIsXCJwcmdcIixcInByaFwiLFwicHJpXCIsXCJwcmtcIixcInBybFwiLFwicHJtXCIsXCJwcm5cIixcInByb1wiLFwicHJwXCIsXCJwcnFcIixcInByclwiLFwicHJzXCIsXCJwcnRcIixcInBydVwiLFwicHJ3XCIsXCJwcnhcIixcInByeVwiLFwicHJ6XCIsXCJwc2FcIixcInBzY1wiLFwicHNkXCIsXCJwc2VcIixcInBzZ1wiLFwicHNoXCIsXCJwc2lcIixcInBzbFwiLFwicHNtXCIsXCJwc25cIixcInBzb1wiLFwicHNwXCIsXCJwc3FcIixcInBzclwiLFwicHNzXCIsXCJwc3RcIixcInBzdVwiLFwicHN3XCIsXCJwc3lcIixcInB0YVwiLFwicHRoXCIsXCJwdGlcIixcInB0blwiLFwicHRvXCIsXCJwdHBcIixcInB0cVwiLFwicHRyXCIsXCJwdHRcIixcInB0dVwiLFwicHR2XCIsXCJwdHdcIixcInB0eVwiLFwicHVhXCIsXCJwdWJcIixcInB1Y1wiLFwicHVkXCIsXCJwdWVcIixcInB1ZlwiLFwicHVnXCIsXCJwdWlcIixcInB1alwiLFwicHVrXCIsXCJwdW1cIixcInB1b1wiLFwicHVwXCIsXCJwdXFcIixcInB1clwiLFwicHV0XCIsXCJwdXVcIixcInB1d1wiLFwicHV4XCIsXCJwdXlcIixcInB1elwiLFwicHdhXCIsXCJwd2JcIixcInB3Z1wiLFwicHdpXCIsXCJwd21cIixcInB3blwiLFwicHdvXCIsXCJwd3JcIixcInB3d1wiLFwicHhtXCIsXCJweWVcIixcInB5bVwiLFwicHluXCIsXCJweXNcIixcInB5dVwiLFwicHl4XCIsXCJweXlcIixcInB6blwiXVxuLFsgXCJxdVwiLFwicXVhXCIsXCJxdWJcIixcInF1Y1wiLFwicXVkXCIsXCJxdWZcIixcInF1Z1wiLFwicXVoXCIsXCJxdWlcIixcInF1a1wiLFwicXVsXCIsXCJxdW1cIixcInF1blwiLFwicXVwXCIsXCJxdXFcIixcInF1clwiLFwicXVzXCIsXCJxdXZcIixcInF1d1wiLFwicXV4XCIsXCJxdXlcIixcInF1elwiLFwicXZhXCIsXCJxdmNcIixcInF2ZVwiLFwicXZoXCIsXCJxdmlcIixcInF2alwiLFwicXZsXCIsXCJxdm1cIixcInF2blwiLFwicXZvXCIsXCJxdnBcIixcInF2c1wiLFwicXZ3XCIsXCJxdnlcIixcInF2elwiLFwicXdhXCIsXCJxd2NcIixcInF3ZVwiLFwicXdoXCIsXCJxd21cIixcInF3c1wiLFwicXd0XCIsXCJxeGFcIixcInF4Y1wiLFwicXhoXCIsXCJxeGxcIixcInF4blwiLFwicXhvXCIsXCJxeHBcIixcInF4cVwiLFwicXhyXCIsXCJxeHNcIixcInF4dFwiLFwicXh1XCIsXCJxeHdcIixcInF5YVwiLFwicXlwXCJdXG4sWyBcInJtXCIsXCJyblwiLFwicm9cIixcInJ1XCIsXCJyd1wiLFwicmFhXCIsXCJyYWJcIixcInJhY1wiLFwicmFkXCIsXCJyYWZcIixcInJhZ1wiLFwicmFoXCIsXCJyYWlcIixcInJhalwiLFwicmFrXCIsXCJyYWxcIixcInJhbVwiLFwicmFuXCIsXCJyYW9cIixcInJhcFwiLFwicmFxXCIsXCJyYXJcIixcInJhc1wiLFwicmF0XCIsXCJyYXVcIixcInJhdlwiLFwicmF3XCIsXCJyYXhcIixcInJheVwiLFwicmF6XCIsXCJyYmJcIixcInJia1wiLFwicmJsXCIsXCJyYnBcIixcInJjZlwiLFwicmRiXCIsXCJyZWFcIixcInJlYlwiLFwicmVlXCIsXCJyZWdcIixcInJlaVwiLFwicmVqXCIsXCJyZWxcIixcInJlbVwiLFwicmVuXCIsXCJyZXJcIixcInJlc1wiLFwicmV0XCIsXCJyZXlcIixcInJnYVwiLFwicmdlXCIsXCJyZ2tcIixcInJnblwiLFwicmdyXCIsXCJyZ3NcIixcInJndVwiLFwicmhnXCIsXCJyaHBcIixcInJpYVwiLFwicmllXCIsXCJyaWZcIixcInJpbFwiLFwicmltXCIsXCJyaW5cIixcInJpclwiLFwicml0XCIsXCJyaXVcIixcInJqZ1wiLFwicmppXCIsXCJyanNcIixcInJrYVwiLFwicmtiXCIsXCJya2hcIixcInJraVwiLFwicmttXCIsXCJya3RcIixcInJrd1wiLFwicm1hXCIsXCJybWJcIixcInJtY1wiLFwicm1kXCIsXCJybWVcIixcInJtZlwiLFwicm1nXCIsXCJybWhcIixcInJtaVwiLFwicm1rXCIsXCJybWxcIixcInJtbVwiLFwicm1uXCIsXCJybW9cIixcInJtcFwiLFwicm1xXCIsXCJybXJcIixcInJtc1wiLFwicm10XCIsXCJybXVcIixcInJtdlwiLFwicm13XCIsXCJybXhcIixcInJteVwiLFwicm16XCIsXCJybmFcIixcInJuZFwiLFwicm5nXCIsXCJybmxcIixcInJublwiLFwicm5wXCIsXCJybnJcIixcInJud1wiLFwicm9hXCIsXCJyb2JcIixcInJvY1wiLFwicm9kXCIsXCJyb2VcIixcInJvZlwiLFwicm9nXCIsXCJyb2xcIixcInJvbVwiLFwicm9vXCIsXCJyb3BcIixcInJvclwiLFwicm91XCIsXCJyb3dcIixcInJwblwiLFwicnB0XCIsXCJycmlcIixcInJyb1wiLFwicnJ0XCIsXCJyc2JcIixcInJzaVwiLFwicnNsXCIsXCJyc21cIixcInJ0Y1wiLFwicnRoXCIsXCJydG1cIixcInJ0c1wiLFwicnR3XCIsXCJydWJcIixcInJ1Y1wiLFwicnVlXCIsXCJydWZcIixcInJ1Z1wiLFwicnVoXCIsXCJydWlcIixcInJ1a1wiLFwicnVvXCIsXCJydXBcIixcInJ1cVwiLFwicnV0XCIsXCJydXVcIixcInJ1eVwiLFwicnV6XCIsXCJyd2FcIixcInJ3a1wiLFwicndsXCIsXCJyd21cIixcInJ3b1wiLFwicndyXCIsXCJyeGRcIixcInJ4d1wiLFwicnluXCIsXCJyeXNcIixcInJ5dVwiLFwicnpoXCJdXG4sWyBcInNhXCIsXCJzY1wiLFwic2RcIixcInNlXCIsXCJzZ1wiLFwic2hcIixcInNpXCIsXCJza1wiLFwic2xcIixcInNtXCIsXCJzblwiLFwic29cIixcInNxXCIsXCJzclwiLFwic3NcIixcInN0XCIsXCJzdVwiLFwic3ZcIixcInN3XCIsXCJzYWFcIixcInNhYlwiLFwic2FjXCIsXCJzYWRcIixcInNhZVwiLFwic2FmXCIsXCJzYWhcIixcInNhaVwiLFwic2FqXCIsXCJzYWtcIixcInNhbFwiLFwic2FtXCIsXCJzYW9cIixcInNhcFwiLFwic2FxXCIsXCJzYXJcIixcInNhc1wiLFwic2F0XCIsXCJzYXVcIixcInNhdlwiLFwic2F3XCIsXCJzYXhcIixcInNheVwiLFwic2F6XCIsXCJzYmFcIixcInNiYlwiLFwic2JjXCIsXCJzYmRcIixcInNiZVwiLFwic2JmXCIsXCJzYmdcIixcInNiaFwiLFwic2JpXCIsXCJzYmpcIixcInNia1wiLFwic2JsXCIsXCJzYm1cIixcInNiblwiLFwic2JvXCIsXCJzYnBcIixcInNicVwiLFwic2JyXCIsXCJzYnNcIixcInNidFwiLFwic2J1XCIsXCJzYnZcIixcInNid1wiLFwic2J4XCIsXCJzYnlcIixcInNielwiLFwic2NhXCIsXCJzY2JcIixcInNjZVwiLFwic2NmXCIsXCJzY2dcIixcInNjaFwiLFwic2NpXCIsXCJzY2tcIixcInNjbFwiLFwic2NuXCIsXCJzY29cIixcInNjcFwiLFwic2NxXCIsXCJzY3NcIixcInNjdFwiLFwic2N1XCIsXCJzY3ZcIixcInNjd1wiLFwic2N4XCIsXCJzZGFcIixcInNkYlwiLFwic2RjXCIsXCJzZGVcIixcInNkZlwiLFwic2RnXCIsXCJzZGhcIixcInNkalwiLFwic2RrXCIsXCJzZGxcIixcInNkbVwiLFwic2RuXCIsXCJzZG9cIixcInNkcFwiLFwic2RxXCIsXCJzZHJcIixcInNkc1wiLFwic2R0XCIsXCJzZHVcIixcInNkdlwiLFwic2R4XCIsXCJzZHpcIixcInNlYVwiLFwic2ViXCIsXCJzZWNcIixcInNlZFwiLFwic2VlXCIsXCJzZWZcIixcInNlZ1wiLFwic2VoXCIsXCJzZWlcIixcInNlalwiLFwic2VrXCIsXCJzZWxcIixcInNlbVwiLFwic2VuXCIsXCJzZW9cIixcInNlcFwiLFwic2VxXCIsXCJzZXJcIixcInNlc1wiLFwic2V0XCIsXCJzZXVcIixcInNldlwiLFwic2V3XCIsXCJzZXlcIixcInNlelwiLFwic2ZiXCIsXCJzZmVcIixcInNmbVwiLFwic2ZzXCIsXCJzZndcIixcInNnYVwiLFwic2diXCIsXCJzZ2NcIixcInNnZFwiLFwic2dlXCIsXCJzZ2dcIixcInNnaFwiLFwic2dpXCIsXCJzZ2pcIixcInNna1wiLFwic2dsXCIsXCJzZ21cIixcInNnblwiLFwic2dvXCIsXCJzZ3BcIixcInNnclwiLFwic2dzXCIsXCJzZ3RcIixcInNndVwiLFwic2d3XCIsXCJzZ3hcIixcInNneVwiLFwic2d6XCIsXCJzaGFcIixcInNoYlwiLFwic2hjXCIsXCJzaGRcIixcInNoZVwiLFwic2hnXCIsXCJzaGhcIixcInNoaVwiLFwic2hqXCIsXCJzaGtcIixcInNobFwiLFwic2htXCIsXCJzaG5cIixcInNob1wiLFwic2hwXCIsXCJzaHFcIixcInNoclwiLFwic2hzXCIsXCJzaHRcIixcInNodVwiLFwic2h2XCIsXCJzaHdcIixcInNoeFwiLFwic2h5XCIsXCJzaHpcIixcInNpYVwiLFwic2liXCIsXCJzaWRcIixcInNpZVwiLFwic2lmXCIsXCJzaWdcIixcInNpaFwiLFwic2lpXCIsXCJzaWpcIixcInNpa1wiLFwic2lsXCIsXCJzaW1cIixcInNpb1wiLFwic2lwXCIsXCJzaXFcIixcInNpclwiLFwic2lzXCIsXCJzaXRcIixcInNpdVwiLFwic2l2XCIsXCJzaXdcIixcInNpeFwiLFwic2l5XCIsXCJzaXpcIixcInNqYVwiLFwic2piXCIsXCJzamRcIixcInNqZVwiLFwic2pnXCIsXCJzamtcIixcInNqbFwiLFwic2ptXCIsXCJzam5cIixcInNqb1wiLFwic2pwXCIsXCJzanJcIixcInNqc1wiLFwic2p0XCIsXCJzanVcIixcInNqd1wiLFwic2thXCIsXCJza2JcIixcInNrY1wiLFwic2tkXCIsXCJza2VcIixcInNrZlwiLFwic2tnXCIsXCJza2hcIixcInNraVwiLFwic2tqXCIsXCJza2tcIixcInNrbVwiLFwic2tuXCIsXCJza29cIixcInNrcFwiLFwic2txXCIsXCJza3JcIixcInNrc1wiLFwic2t0XCIsXCJza3VcIixcInNrdlwiLFwic2t3XCIsXCJza3hcIixcInNreVwiLFwic2t6XCIsXCJzbGFcIixcInNsY1wiLFwic2xkXCIsXCJzbGVcIixcInNsZlwiLFwic2xnXCIsXCJzbGhcIixcInNsaVwiLFwic2xqXCIsXCJzbGxcIixcInNsbVwiLFwic2xuXCIsXCJzbHBcIixcInNscVwiLFwic2xyXCIsXCJzbHNcIixcInNsdFwiLFwic2x1XCIsXCJzbHdcIixcInNseFwiLFwic2x5XCIsXCJzbHpcIixcInNtYVwiLFwic21iXCIsXCJzbWNcIixcInNtZFwiLFwic21mXCIsXCJzbWdcIixcInNtaFwiLFwic21pXCIsXCJzbWpcIixcInNta1wiLFwic21sXCIsXCJzbW1cIixcInNtblwiLFwic21wXCIsXCJzbXFcIixcInNtclwiLFwic21zXCIsXCJzbXRcIixcInNtdVwiLFwic212XCIsXCJzbXdcIixcInNteFwiLFwic215XCIsXCJzbXpcIixcInNuYlwiLFwic25jXCIsXCJzbmVcIixcInNuZlwiLFwic25nXCIsXCJzbmhcIixcInNuaVwiLFwic25qXCIsXCJzbmtcIixcInNubFwiLFwic25tXCIsXCJzbm5cIixcInNub1wiLFwic25wXCIsXCJzbnFcIixcInNuclwiLFwic25zXCIsXCJzbnVcIixcInNudlwiLFwic253XCIsXCJzbnhcIixcInNueVwiLFwic256XCIsXCJzb2FcIixcInNvYlwiLFwic29jXCIsXCJzb2RcIixcInNvZVwiLFwic29nXCIsXCJzb2hcIixcInNvaVwiLFwic29qXCIsXCJzb2tcIixcInNvbFwiLFwic29uXCIsXCJzb29cIixcInNvcFwiLFwic29xXCIsXCJzb3JcIixcInNvc1wiLFwic291XCIsXCJzb3ZcIixcInNvd1wiLFwic294XCIsXCJzb3lcIixcInNvelwiLFwic3BiXCIsXCJzcGNcIixcInNwZFwiLFwic3BlXCIsXCJzcGdcIixcInNwaVwiLFwic3BrXCIsXCJzcGxcIixcInNwbVwiLFwic3BuXCIsXCJzcG9cIixcInNwcFwiLFwic3BxXCIsXCJzcHJcIixcInNwc1wiLFwic3B0XCIsXCJzcHVcIixcInNwdlwiLFwic3B4XCIsXCJzcHlcIixcInNxYVwiLFwic3FoXCIsXCJzcWpcIixcInNxa1wiLFwic3FtXCIsXCJzcW5cIixcInNxb1wiLFwic3FxXCIsXCJzcXJcIixcInNxc1wiLFwic3F0XCIsXCJzcXVcIixcInNxeFwiLFwic3JhXCIsXCJzcmJcIixcInNyY1wiLFwic3JlXCIsXCJzcmZcIixcInNyZ1wiLFwic3JoXCIsXCJzcmlcIixcInNya1wiLFwic3JsXCIsXCJzcm1cIixcInNyblwiLFwic3JvXCIsXCJzcnFcIixcInNyclwiLFwic3JzXCIsXCJzcnRcIixcInNydVwiLFwic3J2XCIsXCJzcndcIixcInNyeFwiLFwic3J5XCIsXCJzcnpcIixcInNzYVwiLFwic3NiXCIsXCJzc2NcIixcInNzZFwiLFwic3NlXCIsXCJzc2ZcIixcInNzZ1wiLFwic3NoXCIsXCJzc2lcIixcInNzalwiLFwic3NrXCIsXCJzc2xcIixcInNzbVwiLFwic3NuXCIsXCJzc29cIixcInNzcFwiLFwic3NxXCIsXCJzc3JcIixcInNzc1wiLFwic3N0XCIsXCJzc3VcIixcInNzdlwiLFwic3N4XCIsXCJzc3lcIixcInNzelwiLFwic3RhXCIsXCJzdGJcIixcInN0ZFwiLFwic3RlXCIsXCJzdGZcIixcInN0Z1wiLFwic3RoXCIsXCJzdGlcIixcInN0alwiLFwic3RrXCIsXCJzdGxcIixcInN0bVwiLFwic3RuXCIsXCJzdG9cIixcInN0cFwiLFwic3RxXCIsXCJzdHJcIixcInN0c1wiLFwic3R0XCIsXCJzdHVcIixcInN0dlwiLFwic3R3XCIsXCJzdHlcIixcInN1YVwiLFwic3ViXCIsXCJzdWNcIixcInN1ZVwiLFwic3VnXCIsXCJzdWlcIixcInN1alwiLFwic3VrXCIsXCJzdWxcIixcInN1bVwiLFwic3VvXCIsXCJzdXFcIixcInN1clwiLFwic3VzXCIsXCJzdXRcIixcInN1dlwiLFwic3V3XCIsXCJzdXhcIixcInN1eVwiLFwic3V6XCIsXCJzdmFcIixcInN2YlwiLFwic3ZjXCIsXCJzdmVcIixcInN2a1wiLFwic3ZtXCIsXCJzdnJcIixcInN2c1wiLFwic3Z4XCIsXCJzd2JcIixcInN3Y1wiLFwic3dmXCIsXCJzd2dcIixcInN3aFwiLFwic3dpXCIsXCJzd2pcIixcInN3a1wiLFwic3dsXCIsXCJzd21cIixcInN3blwiLFwic3dvXCIsXCJzd3BcIixcInN3cVwiLFwic3dyXCIsXCJzd3NcIixcInN3dFwiLFwic3d1XCIsXCJzd3ZcIixcInN3d1wiLFwic3d4XCIsXCJzd3lcIixcInN4YlwiLFwic3hjXCIsXCJzeGVcIixcInN4Z1wiLFwic3hrXCIsXCJzeGxcIixcInN4bVwiLFwic3huXCIsXCJzeG9cIixcInN4clwiLFwic3hzXCIsXCJzeHVcIixcInN4d1wiLFwic3lhXCIsXCJzeWJcIixcInN5Y1wiLFwic3lkXCIsXCJzeWlcIixcInN5a1wiLFwic3lsXCIsXCJzeW1cIixcInN5blwiLFwic3lvXCIsXCJzeXJcIixcInN5c1wiLFwic3l3XCIsXCJzeXhcIixcInN5eVwiLFwic3phXCIsXCJzemJcIixcInN6Y1wiLFwic3pkXCIsXCJzemVcIixcInN6Z1wiLFwic3psXCIsXCJzem5cIixcInN6cFwiLFwic3pzXCIsXCJzenZcIixcInN6d1wiLFwic3p5XCJdXG4sWyBcInRhXCIsXCJ0ZVwiLFwidGdcIixcInRoXCIsXCJ0aVwiLFwidGtcIixcInRsXCIsXCJ0blwiLFwidG9cIixcInRyXCIsXCJ0c1wiLFwidHRcIixcInR3XCIsXCJ0eVwiLFwidGFhXCIsXCJ0YWJcIixcInRhY1wiLFwidGFkXCIsXCJ0YWVcIixcInRhZlwiLFwidGFnXCIsXCJ0YWlcIixcInRhalwiLFwidGFrXCIsXCJ0YWxcIixcInRhblwiLFwidGFvXCIsXCJ0YXBcIixcInRhcVwiLFwidGFyXCIsXCJ0YXNcIixcInRhdVwiLFwidGF2XCIsXCJ0YXdcIixcInRheFwiLFwidGF5XCIsXCJ0YXpcIixcInRiYVwiLFwidGJiXCIsXCJ0YmNcIixcInRiZFwiLFwidGJlXCIsXCJ0YmZcIixcInRiZ1wiLFwidGJoXCIsXCJ0YmlcIixcInRialwiLFwidGJrXCIsXCJ0YmxcIixcInRibVwiLFwidGJuXCIsXCJ0Ym9cIixcInRicFwiLFwidGJxXCIsXCJ0YnJcIixcInRic1wiLFwidGJ0XCIsXCJ0YnVcIixcInRidlwiLFwidGJ3XCIsXCJ0YnhcIixcInRieVwiLFwidGJ6XCIsXCJ0Y2FcIixcInRjYlwiLFwidGNjXCIsXCJ0Y2RcIixcInRjZVwiLFwidGNmXCIsXCJ0Y2dcIixcInRjaFwiLFwidGNpXCIsXCJ0Y2tcIixcInRjbFwiLFwidGNtXCIsXCJ0Y25cIixcInRjb1wiLFwidGNwXCIsXCJ0Y3FcIixcInRjc1wiLFwidGN0XCIsXCJ0Y3VcIixcInRjd1wiLFwidGN4XCIsXCJ0Y3lcIixcInRjelwiLFwidGRhXCIsXCJ0ZGJcIixcInRkY1wiLFwidGRkXCIsXCJ0ZGVcIixcInRkZlwiLFwidGRnXCIsXCJ0ZGhcIixcInRkaVwiLFwidGRqXCIsXCJ0ZGtcIixcInRkbFwiLFwidGRtXCIsXCJ0ZG5cIixcInRkb1wiLFwidGRxXCIsXCJ0ZHJcIixcInRkc1wiLFwidGR0XCIsXCJ0ZHVcIixcInRkdlwiLFwidGR4XCIsXCJ0ZHlcIixcInRlYVwiLFwidGViXCIsXCJ0ZWNcIixcInRlZFwiLFwidGVlXCIsXCJ0ZWZcIixcInRlZ1wiLFwidGVoXCIsXCJ0ZWlcIixcInRla1wiLFwidGVtXCIsXCJ0ZW5cIixcInRlb1wiLFwidGVwXCIsXCJ0ZXFcIixcInRlclwiLFwidGVzXCIsXCJ0ZXRcIixcInRldVwiLFwidGV2XCIsXCJ0ZXdcIixcInRleFwiLFwidGV5XCIsXCJ0ZXpcIixcInRmaVwiLFwidGZuXCIsXCJ0Zm9cIixcInRmclwiLFwidGZ0XCIsXCJ0Z2FcIixcInRnYlwiLFwidGdjXCIsXCJ0Z2RcIixcInRnZVwiLFwidGdmXCIsXCJ0Z2dcIixcInRnaFwiLFwidGdpXCIsXCJ0Z2pcIixcInRnblwiLFwidGdvXCIsXCJ0Z3BcIixcInRncVwiLFwidGdyXCIsXCJ0Z3NcIixcInRndFwiLFwidGd1XCIsXCJ0Z3ZcIixcInRnd1wiLFwidGd4XCIsXCJ0Z3lcIixcInRnelwiLFwidGhjXCIsXCJ0aGRcIixcInRoZVwiLFwidGhmXCIsXCJ0aGhcIixcInRoaVwiLFwidGhrXCIsXCJ0aGxcIixcInRobVwiLFwidGhuXCIsXCJ0aHBcIixcInRocVwiLFwidGhyXCIsXCJ0aHNcIixcInRodFwiLFwidGh1XCIsXCJ0aHZcIixcInRod1wiLFwidGh4XCIsXCJ0aHlcIixcInRoelwiLFwidGlhXCIsXCJ0aWNcIixcInRpZFwiLFwidGllXCIsXCJ0aWZcIixcInRpZ1wiLFwidGloXCIsXCJ0aWlcIixcInRpalwiLFwidGlrXCIsXCJ0aWxcIixcInRpbVwiLFwidGluXCIsXCJ0aW9cIixcInRpcFwiLFwidGlxXCIsXCJ0aXNcIixcInRpdFwiLFwidGl1XCIsXCJ0aXZcIixcInRpd1wiLFwidGl4XCIsXCJ0aXlcIixcInRpelwiLFwidGphXCIsXCJ0amdcIixcInRqaVwiLFwidGpqXCIsXCJ0amxcIixcInRqbVwiLFwidGpuXCIsXCJ0am9cIixcInRqcFwiLFwidGpzXCIsXCJ0anVcIixcInRqd1wiLFwidGthXCIsXCJ0a2JcIixcInRrZFwiLFwidGtlXCIsXCJ0a2ZcIixcInRrZ1wiLFwidGtrXCIsXCJ0a2xcIixcInRrbVwiLFwidGtuXCIsXCJ0a3BcIixcInRrcVwiLFwidGtyXCIsXCJ0a3NcIixcInRrdFwiLFwidGt1XCIsXCJ0a3ZcIixcInRrd1wiLFwidGt4XCIsXCJ0a3pcIixcInRsYVwiLFwidGxiXCIsXCJ0bGNcIixcInRsZFwiLFwidGxmXCIsXCJ0bGdcIixcInRsaFwiLFwidGxpXCIsXCJ0bGpcIixcInRsa1wiLFwidGxsXCIsXCJ0bG1cIixcInRsblwiLFwidGxvXCIsXCJ0bHBcIixcInRscVwiLFwidGxyXCIsXCJ0bHNcIixcInRsdFwiLFwidGx1XCIsXCJ0bHZcIixcInRsd1wiLFwidGx4XCIsXCJ0bHlcIixcInRtYVwiLFwidG1iXCIsXCJ0bWNcIixcInRtZFwiLFwidG1lXCIsXCJ0bWZcIixcInRtZ1wiLFwidG1oXCIsXCJ0bWlcIixcInRtalwiLFwidG1rXCIsXCJ0bWxcIixcInRtbVwiLFwidG1uXCIsXCJ0bW9cIixcInRtcFwiLFwidG1xXCIsXCJ0bXJcIixcInRtc1wiLFwidG10XCIsXCJ0bXVcIixcInRtdlwiLFwidG13XCIsXCJ0bXlcIixcInRtelwiLFwidG5hXCIsXCJ0bmJcIixcInRuY1wiLFwidG5kXCIsXCJ0bmVcIixcInRuZlwiLFwidG5nXCIsXCJ0bmhcIixcInRuaVwiLFwidG5rXCIsXCJ0bmxcIixcInRubVwiLFwidG5uXCIsXCJ0bm9cIixcInRucFwiLFwidG5xXCIsXCJ0bnJcIixcInRuc1wiLFwidG50XCIsXCJ0bnVcIixcInRudlwiLFwidG53XCIsXCJ0bnhcIixcInRueVwiLFwidG56XCIsXCJ0b2JcIixcInRvY1wiLFwidG9kXCIsXCJ0b2VcIixcInRvZlwiLFwidG9nXCIsXCJ0b2hcIixcInRvaVwiLFwidG9qXCIsXCJ0b2xcIixcInRvbVwiLFwidG9vXCIsXCJ0b3BcIixcInRvcVwiLFwidG9yXCIsXCJ0b3NcIixcInRvdVwiLFwidG92XCIsXCJ0b3dcIixcInRveFwiLFwidG95XCIsXCJ0b3pcIixcInRwYVwiLFwidHBjXCIsXCJ0cGVcIixcInRwZlwiLFwidHBnXCIsXCJ0cGlcIixcInRwalwiLFwidHBrXCIsXCJ0cGxcIixcInRwbVwiLFwidHBuXCIsXCJ0cG9cIixcInRwcFwiLFwidHBxXCIsXCJ0cHJcIixcInRwdFwiLFwidHB1XCIsXCJ0cHZcIixcInRwd1wiLFwidHB4XCIsXCJ0cHlcIixcInRwelwiLFwidHFiXCIsXCJ0cWxcIixcInRxbVwiLFwidHFuXCIsXCJ0cW9cIixcInRxcFwiLFwidHFxXCIsXCJ0cXJcIixcInRxdFwiLFwidHF1XCIsXCJ0cXdcIixcInRyYVwiLFwidHJiXCIsXCJ0cmNcIixcInRyZFwiLFwidHJlXCIsXCJ0cmZcIixcInRyZ1wiLFwidHJoXCIsXCJ0cmlcIixcInRyalwiLFwidHJrXCIsXCJ0cmxcIixcInRybVwiLFwidHJuXCIsXCJ0cm9cIixcInRycFwiLFwidHJxXCIsXCJ0cnJcIixcInRyc1wiLFwidHJ0XCIsXCJ0cnVcIixcInRydlwiLFwidHJ3XCIsXCJ0cnhcIixcInRyeVwiLFwidHJ6XCIsXCJ0c2FcIixcInRzYlwiLFwidHNjXCIsXCJ0c2RcIixcInRzZVwiLFwidHNmXCIsXCJ0c2dcIixcInRzaFwiLFwidHNpXCIsXCJ0c2pcIixcInRza1wiLFwidHNsXCIsXCJ0c21cIixcInRzcFwiLFwidHNxXCIsXCJ0c3JcIixcInRzc1wiLFwidHN0XCIsXCJ0c3VcIixcInRzdlwiLFwidHN3XCIsXCJ0c3hcIixcInRzeVwiLFwidHN6XCIsXCJ0dGFcIixcInR0YlwiLFwidHRjXCIsXCJ0dGRcIixcInR0ZVwiLFwidHRmXCIsXCJ0dGdcIixcInR0aFwiLFwidHRpXCIsXCJ0dGpcIixcInR0a1wiLFwidHRsXCIsXCJ0dG1cIixcInR0blwiLFwidHRvXCIsXCJ0dHBcIixcInR0cVwiLFwidHRyXCIsXCJ0dHNcIixcInR0dFwiLFwidHR1XCIsXCJ0dHZcIixcInR0d1wiLFwidHR5XCIsXCJ0dHpcIixcInR1YVwiLFwidHViXCIsXCJ0dWNcIixcInR1ZFwiLFwidHVlXCIsXCJ0dWZcIixcInR1Z1wiLFwidHVoXCIsXCJ0dWlcIixcInR1alwiLFwidHVsXCIsXCJ0dW1cIixcInR1blwiLFwidHVvXCIsXCJ0dXBcIixcInR1cVwiLFwidHVzXCIsXCJ0dXRcIixcInR1dVwiLFwidHV2XCIsXCJ0dXdcIixcInR1eFwiLFwidHV5XCIsXCJ0dXpcIixcInR2YVwiLFwidHZkXCIsXCJ0dmVcIixcInR2a1wiLFwidHZsXCIsXCJ0dm1cIixcInR2blwiLFwidHZvXCIsXCJ0dnNcIixcInR2dFwiLFwidHZ1XCIsXCJ0dndcIixcInR2eFwiLFwidHZ5XCIsXCJ0d2FcIixcInR3YlwiLFwidHdjXCIsXCJ0d2RcIixcInR3ZVwiLFwidHdmXCIsXCJ0d2dcIixcInR3aFwiLFwidHdsXCIsXCJ0d21cIixcInR3blwiLFwidHdvXCIsXCJ0d3BcIixcInR3cVwiLFwidHdyXCIsXCJ0d3RcIixcInR3dVwiLFwidHd3XCIsXCJ0d3hcIixcInR3eVwiLFwidHhhXCIsXCJ0eGJcIixcInR4Y1wiLFwidHhlXCIsXCJ0eGdcIixcInR4aFwiLFwidHhpXCIsXCJ0eGpcIixcInR4bVwiLFwidHhuXCIsXCJ0eG9cIixcInR4cVwiLFwidHhyXCIsXCJ0eHNcIixcInR4dFwiLFwidHh1XCIsXCJ0eHhcIixcInR4eVwiLFwidHlhXCIsXCJ0eWVcIixcInR5aFwiLFwidHlpXCIsXCJ0eWpcIixcInR5bFwiLFwidHluXCIsXCJ0eXBcIixcInR5clwiLFwidHlzXCIsXCJ0eXRcIixcInR5dVwiLFwidHl2XCIsXCJ0eXhcIixcInR5eVwiLFwidHl6XCIsXCJ0emFcIixcInR6aFwiLFwidHpqXCIsXCJ0emxcIixcInR6bVwiLFwidHpuXCIsXCJ0em9cIixcInR6eFwiXVxuLFsgXCJ1Z1wiLFwidWtcIixcInVyXCIsXCJ1elwiLFwidWFtXCIsXCJ1YW5cIixcInVhclwiLFwidWJhXCIsXCJ1YmlcIixcInVibFwiLFwidWJyXCIsXCJ1YnVcIixcInVieVwiLFwidWRhXCIsXCJ1ZGVcIixcInVkZ1wiLFwidWRpXCIsXCJ1ZGpcIixcInVkbFwiLFwidWRtXCIsXCJ1ZHVcIixcInVlc1wiLFwidWZpXCIsXCJ1Z2FcIixcInVnYlwiLFwidWdlXCIsXCJ1Z25cIixcInVnb1wiLFwidWd5XCIsXCJ1aGFcIixcInVoblwiLFwidWlzXCIsXCJ1aXZcIixcInVqaVwiLFwidWthXCIsXCJ1a2dcIixcInVraFwiLFwidWtpXCIsXCJ1a2tcIixcInVrbFwiLFwidWtwXCIsXCJ1a3FcIixcInVrc1wiLFwidWt1XCIsXCJ1a3ZcIixcInVrd1wiLFwidWt5XCIsXCJ1bGFcIixcInVsYlwiLFwidWxjXCIsXCJ1bGVcIixcInVsZlwiLFwidWxpXCIsXCJ1bGtcIixcInVsbFwiLFwidWxtXCIsXCJ1bG5cIixcInVsdVwiLFwidWx3XCIsXCJ1bWFcIixcInVtYlwiLFwidW1jXCIsXCJ1bWRcIixcInVtZ1wiLFwidW1pXCIsXCJ1bW1cIixcInVtblwiLFwidW1vXCIsXCJ1bXBcIixcInVtclwiLFwidW1zXCIsXCJ1bXVcIixcInVuYVwiLFwidW5kXCIsXCJ1bmVcIixcInVuZ1wiLFwidW5pXCIsXCJ1bmtcIixcInVubVwiLFwidW5uXCIsXCJ1bnBcIixcInVuclwiLFwidW51XCIsXCJ1bnhcIixcInVuelwiLFwidW9rXCIsXCJ1cGlcIixcInVwdlwiLFwidXJhXCIsXCJ1cmJcIixcInVyY1wiLFwidXJlXCIsXCJ1cmZcIixcInVyZ1wiLFwidXJoXCIsXCJ1cmlcIixcInVyalwiLFwidXJrXCIsXCJ1cmxcIixcInVybVwiLFwidXJuXCIsXCJ1cm9cIixcInVycFwiLFwidXJyXCIsXCJ1cnRcIixcInVydVwiLFwidXJ2XCIsXCJ1cndcIixcInVyeFwiLFwidXJ5XCIsXCJ1cnpcIixcInVzYVwiLFwidXNoXCIsXCJ1c2lcIixcInVza1wiLFwidXNwXCIsXCJ1c3NcIixcInVzdVwiLFwidXRhXCIsXCJ1dGVcIixcInV0aFwiLFwidXRwXCIsXCJ1dHJcIixcInV0dVwiLFwidXVtXCIsXCJ1dW5cIixcInV1clwiLFwidXV1XCIsXCJ1dmVcIixcInV2aFwiLFwidXZsXCIsXCJ1d2FcIixcInV5YVwiLFwidXpuXCIsXCJ1enNcIl1cbixbIFwidmVcIixcInZpXCIsXCJ2b1wiLFwidmFhXCIsXCJ2YWVcIixcInZhZlwiLFwidmFnXCIsXCJ2YWhcIixcInZhaVwiLFwidmFqXCIsXCJ2YWxcIixcInZhbVwiLFwidmFuXCIsXCJ2YW9cIixcInZhcFwiLFwidmFyXCIsXCJ2YXNcIixcInZhdVwiLFwidmF2XCIsXCJ2YXlcIixcInZiYlwiLFwidmJrXCIsXCJ2ZWNcIixcInZlZFwiLFwidmVsXCIsXCJ2ZW1cIixcInZlb1wiLFwidmVwXCIsXCJ2ZXJcIixcInZnclwiLFwidmd0XCIsXCJ2aWNcIixcInZpZFwiLFwidmlmXCIsXCJ2aWdcIixcInZpbFwiLFwidmluXCIsXCJ2aXNcIixcInZpdFwiLFwidml2XCIsXCJ2a2FcIixcInZraVwiLFwidmtqXCIsXCJ2a2tcIixcInZrbFwiLFwidmttXCIsXCJ2a25cIixcInZrb1wiLFwidmtwXCIsXCJ2a3RcIixcInZrdVwiLFwidmt6XCIsXCJ2bHBcIixcInZsc1wiLFwidm1hXCIsXCJ2bWJcIixcInZtY1wiLFwidm1kXCIsXCJ2bWVcIixcInZtZlwiLFwidm1nXCIsXCJ2bWhcIixcInZtaVwiLFwidm1qXCIsXCJ2bWtcIixcInZtbFwiLFwidm1tXCIsXCJ2bXBcIixcInZtcVwiLFwidm1yXCIsXCJ2bXNcIixcInZtdVwiLFwidm12XCIsXCJ2bXdcIixcInZteFwiLFwidm15XCIsXCJ2bXpcIixcInZua1wiLFwidm5tXCIsXCJ2bnBcIixcInZvclwiLFwidm90XCIsXCJ2cmFcIixcInZyb1wiLFwidnJzXCIsXCJ2cnRcIixcInZzaVwiLFwidnNsXCIsXCJ2c3ZcIixcInZ0b1wiLFwidnVtXCIsXCJ2dW5cIixcInZ1dFwiLFwidndhXCJdXG4sWyBcIndhXCIsXCJ3b1wiLFwid2FhXCIsXCJ3YWJcIixcIndhY1wiLFwid2FkXCIsXCJ3YWVcIixcIndhZlwiLFwid2FnXCIsXCJ3YWhcIixcIndhaVwiLFwid2FqXCIsXCJ3YWtcIixcIndhbFwiLFwid2FtXCIsXCJ3YW5cIixcIndhb1wiLFwid2FwXCIsXCJ3YXFcIixcIndhclwiLFwid2FzXCIsXCJ3YXRcIixcIndhdVwiLFwid2F2XCIsXCJ3YXdcIixcIndheFwiLFwid2F5XCIsXCJ3YXpcIixcIndiYVwiLFwid2JiXCIsXCJ3YmVcIixcIndiZlwiLFwid2JoXCIsXCJ3YmlcIixcIndialwiLFwid2JrXCIsXCJ3YmxcIixcIndibVwiLFwid2JwXCIsXCJ3YnFcIixcIndiclwiLFwid2JzXCIsXCJ3YnRcIixcIndidlwiLFwid2J3XCIsXCJ3Y2FcIixcIndjaVwiLFwid2RkXCIsXCJ3ZGdcIixcIndkalwiLFwid2RrXCIsXCJ3ZHVcIixcIndkeVwiLFwid2VhXCIsXCJ3ZWNcIixcIndlZFwiLFwid2VnXCIsXCJ3ZWhcIixcIndlaVwiLFwid2VtXCIsXCJ3ZW5cIixcIndlb1wiLFwid2VwXCIsXCJ3ZXJcIixcIndlc1wiLFwid2V0XCIsXCJ3ZXVcIixcIndld1wiLFwid2ZnXCIsXCJ3Z2FcIixcIndnYlwiLFwid2dnXCIsXCJ3Z2lcIixcIndnb1wiLFwid2d1XCIsXCJ3Z3dcIixcIndneVwiLFwid2hhXCIsXCJ3aGdcIixcIndoa1wiLFwid2h1XCIsXCJ3aWJcIixcIndpY1wiLFwid2llXCIsXCJ3aWZcIixcIndpZ1wiLFwid2loXCIsXCJ3aWlcIixcIndpalwiLFwid2lrXCIsXCJ3aWxcIixcIndpbVwiLFwid2luXCIsXCJ3aXJcIixcIndpdFwiLFwid2l1XCIsXCJ3aXZcIixcIndpd1wiLFwid2l5XCIsXCJ3amFcIixcIndqaVwiLFwid2thXCIsXCJ3a2JcIixcIndrZFwiLFwid2tsXCIsXCJ3a3JcIixcIndrdVwiLFwid2t3XCIsXCJ3a3lcIixcIndsYVwiLFwid2xjXCIsXCJ3bGVcIixcIndsZ1wiLFwid2xoXCIsXCJ3bGlcIixcIndsa1wiLFwid2xsXCIsXCJ3bG1cIixcIndsb1wiLFwid2xyXCIsXCJ3bHNcIixcIndsdVwiLFwid2x2XCIsXCJ3bHdcIixcIndseFwiLFwid2x5XCIsXCJ3bWFcIixcIndtYlwiLFwid21jXCIsXCJ3bWRcIixcIndtZVwiLFwid21nXCIsXCJ3bWhcIixcIndtaVwiLFwid21tXCIsXCJ3bW5cIixcIndtb1wiLFwid21zXCIsXCJ3bXRcIixcIndtd1wiLFwid214XCIsXCJ3bmJcIixcInduY1wiLFwid25kXCIsXCJ3bmVcIixcInduZ1wiLFwid25pXCIsXCJ3bmtcIixcIndubVwiLFwid25uXCIsXCJ3bm9cIixcInducFwiLFwid251XCIsXCJ3bndcIixcIndueVwiLFwid29hXCIsXCJ3b2JcIixcIndvY1wiLFwid29kXCIsXCJ3b2VcIixcIndvZlwiLFwid29nXCIsXCJ3b2lcIixcIndva1wiLFwid29tXCIsXCJ3b25cIixcIndvb1wiLFwid29yXCIsXCJ3b3NcIixcIndvd1wiLFwid295XCIsXCJ3cGNcIixcIndyYVwiLFwid3JiXCIsXCJ3cmRcIixcIndyZ1wiLFwid3JoXCIsXCJ3cmlcIixcIndya1wiLFwid3JsXCIsXCJ3cm1cIixcIndyblwiLFwid3JvXCIsXCJ3cnBcIixcIndyclwiLFwid3JzXCIsXCJ3cnVcIixcIndydlwiLFwid3J3XCIsXCJ3cnhcIixcIndyeVwiLFwid3J6XCIsXCJ3c2FcIixcIndzZ1wiLFwid3NpXCIsXCJ3c2tcIixcIndzclwiLFwid3NzXCIsXCJ3c3VcIixcIndzdlwiLFwid3RmXCIsXCJ3dGhcIixcInd0aVwiLFwid3RrXCIsXCJ3dG1cIixcInd0d1wiLFwid3VhXCIsXCJ3dWJcIixcInd1ZFwiLFwid3VoXCIsXCJ3dWxcIixcInd1bVwiLFwid3VuXCIsXCJ3dXJcIixcInd1dFwiLFwid3V1XCIsXCJ3dXZcIixcInd1eFwiLFwid3V5XCIsXCJ3d2FcIixcInd3YlwiLFwid3dvXCIsXCJ3d3JcIixcInd3d1wiLFwid3hhXCIsXCJ3eHdcIixcInd5YVwiLFwid3liXCIsXCJ3eWlcIixcInd5bVwiLFwid3lyXCIsXCJ3eXlcIl1cbixbIFwieGhcIixcInhhYVwiLFwieGFiXCIsXCJ4YWNcIixcInhhZFwiLFwieGFlXCIsXCJ4YWdcIixcInhhaVwiLFwieGFqXCIsXCJ4YWtcIixcInhhbFwiLFwieGFtXCIsXCJ4YW5cIixcInhhb1wiLFwieGFwXCIsXCJ4YXFcIixcInhhclwiLFwieGFzXCIsXCJ4YXRcIixcInhhdVwiLFwieGF2XCIsXCJ4YXdcIixcInhheVwiLFwieGJhXCIsXCJ4YmJcIixcInhiY1wiLFwieGJkXCIsXCJ4YmVcIixcInhiZ1wiLFwieGJpXCIsXCJ4YmpcIixcInhibVwiLFwieGJuXCIsXCJ4Ym9cIixcInhicFwiLFwieGJyXCIsXCJ4YndcIixcInhieFwiLFwieGJ5XCIsXCJ4Y2JcIixcInhjY1wiLFwieGNlXCIsXCJ4Y2dcIixcInhjaFwiLFwieGNsXCIsXCJ4Y21cIixcInhjblwiLFwieGNvXCIsXCJ4Y3JcIixcInhjdFwiLFwieGN1XCIsXCJ4Y3ZcIixcInhjd1wiLFwieGN5XCIsXCJ4ZGFcIixcInhkY1wiLFwieGRrXCIsXCJ4ZG1cIixcInhkb1wiLFwieGR5XCIsXCJ4ZWJcIixcInhlZFwiLFwieGVnXCIsXCJ4ZWxcIixcInhlbVwiLFwieGVwXCIsXCJ4ZXJcIixcInhlc1wiLFwieGV0XCIsXCJ4ZXVcIixcInhmYVwiLFwieGdhXCIsXCJ4Z2JcIixcInhnZFwiLFwieGdmXCIsXCJ4Z2dcIixcInhnaVwiLFwieGdsXCIsXCJ4Z21cIixcInhnblwiLFwieGdyXCIsXCJ4Z3VcIixcInhnd1wiLFwieGhhXCIsXCJ4aGNcIixcInhoZFwiLFwieGhlXCIsXCJ4aHJcIixcInhodFwiLFwieGh1XCIsXCJ4aHZcIixcInhpYVwiLFwieGliXCIsXCJ4aWlcIixcInhpbFwiLFwieGluXCIsXCJ4aXBcIixcInhpclwiLFwieGlzXCIsXCJ4aXZcIixcInhpeVwiLFwieGpiXCIsXCJ4anRcIixcInhrYVwiLFwieGtiXCIsXCJ4a2NcIixcInhrZFwiLFwieGtlXCIsXCJ4a2ZcIixcInhrZ1wiLFwieGtoXCIsXCJ4a2lcIixcInhralwiLFwieGtrXCIsXCJ4a2xcIixcInhrblwiLFwieGtvXCIsXCJ4a3BcIixcInhrcVwiLFwieGtyXCIsXCJ4a3NcIixcInhrdFwiLFwieGt1XCIsXCJ4a3ZcIixcInhrd1wiLFwieGt4XCIsXCJ4a3lcIixcInhrelwiLFwieGxhXCIsXCJ4bGJcIixcInhsY1wiLFwieGxkXCIsXCJ4bGVcIixcInhsZ1wiLFwieGxpXCIsXCJ4bG5cIixcInhsb1wiLFwieGxwXCIsXCJ4bHNcIixcInhsdVwiLFwieGx5XCIsXCJ4bWFcIixcInhtYlwiLFwieG1jXCIsXCJ4bWRcIixcInhtZVwiLFwieG1mXCIsXCJ4bWdcIixcInhtaFwiLFwieG1qXCIsXCJ4bWtcIixcInhtbFwiLFwieG1tXCIsXCJ4bW5cIixcInhtb1wiLFwieG1wXCIsXCJ4bXFcIixcInhtclwiLFwieG1zXCIsXCJ4bXRcIixcInhtdVwiLFwieG12XCIsXCJ4bXdcIixcInhteFwiLFwieG15XCIsXCJ4bXpcIixcInhuYVwiLFwieG5iXCIsXCJ4bmRcIixcInhuZ1wiLFwieG5oXCIsXCJ4bmlcIixcInhualwiLFwieG5rXCIsXCJ4bm1cIixcInhublwiLFwieG5vXCIsXCJ4bnFcIixcInhuclwiLFwieG5zXCIsXCJ4bnRcIixcInhudVwiLFwieG55XCIsXCJ4bnpcIixcInhvY1wiLFwieG9kXCIsXCJ4b2dcIixcInhvaVwiLFwieG9rXCIsXCJ4b21cIixcInhvblwiLFwieG9vXCIsXCJ4b3BcIixcInhvclwiLFwieG93XCIsXCJ4cGFcIixcInhwYlwiLFwieHBjXCIsXCJ4cGRcIixcInhwZVwiLFwieHBmXCIsXCJ4cGdcIixcInhwaFwiLFwieHBpXCIsXCJ4cGpcIixcInhwa1wiLFwieHBsXCIsXCJ4cG1cIixcInhwblwiLFwieHBvXCIsXCJ4cHBcIixcInhwcVwiLFwieHByXCIsXCJ4cHNcIixcInhwdFwiLFwieHB1XCIsXCJ4cHZcIixcInhwd1wiLFwieHB4XCIsXCJ4cHlcIixcInhwelwiLFwieHFhXCIsXCJ4cXRcIixcInhyYVwiLFwieHJiXCIsXCJ4cmRcIixcInhyZVwiLFwieHJnXCIsXCJ4cmlcIixcInhybVwiLFwieHJuXCIsXCJ4cnFcIixcInhyclwiLFwieHJ0XCIsXCJ4cnVcIixcInhyd1wiLFwieHNhXCIsXCJ4c2JcIixcInhzY1wiLFwieHNkXCIsXCJ4c2VcIixcInhzaFwiLFwieHNpXCIsXCJ4c2pcIixcInhzbFwiLFwieHNtXCIsXCJ4c25cIixcInhzb1wiLFwieHNwXCIsXCJ4c3FcIixcInhzclwiLFwieHNzXCIsXCJ4c3VcIixcInhzdlwiLFwieHN5XCIsXCJ4dGFcIixcInh0YlwiLFwieHRjXCIsXCJ4dGRcIixcInh0ZVwiLFwieHRnXCIsXCJ4dGhcIixcInh0aVwiLFwieHRqXCIsXCJ4dGxcIixcInh0bVwiLFwieHRuXCIsXCJ4dG9cIixcInh0cFwiLFwieHRxXCIsXCJ4dHJcIixcInh0c1wiLFwieHR0XCIsXCJ4dHVcIixcInh0dlwiLFwieHR3XCIsXCJ4dHlcIixcInh0elwiLFwieHVhXCIsXCJ4dWJcIixcInh1ZFwiLFwieHVnXCIsXCJ4dWpcIixcInh1bFwiLFwieHVtXCIsXCJ4dW5cIixcInh1b1wiLFwieHVwXCIsXCJ4dXJcIixcInh1dFwiLFwieHV1XCIsXCJ4dmVcIixcInh2aVwiLFwieHZuXCIsXCJ4dm9cIixcInh2c1wiLFwieHdhXCIsXCJ4d2NcIixcInh3ZFwiLFwieHdlXCIsXCJ4d2dcIixcInh3alwiLFwieHdrXCIsXCJ4d2xcIixcInh3b1wiLFwieHdyXCIsXCJ4d3RcIixcInh3d1wiLFwieHhiXCIsXCJ4eGtcIixcInh4bVwiLFwieHhyXCIsXCJ4eHRcIixcInh5YVwiLFwieHliXCIsXCJ4eWpcIixcInh5a1wiLFwieHlsXCIsXCJ4eXRcIixcInh5eVwiLFwieHpoXCIsXCJ4em1cIixcInh6cFwiXVxuLFsgXCJ5aVwiLFwieW9cIixcInlhYVwiLFwieWFiXCIsXCJ5YWNcIixcInlhZFwiLFwieWFlXCIsXCJ5YWZcIixcInlhZ1wiLFwieWFoXCIsXCJ5YWlcIixcInlhalwiLFwieWFrXCIsXCJ5YWxcIixcInlhbVwiLFwieWFuXCIsXCJ5YW9cIixcInlhcFwiLFwieWFxXCIsXCJ5YXJcIixcInlhc1wiLFwieWF0XCIsXCJ5YXVcIixcInlhdlwiLFwieWF3XCIsXCJ5YXhcIixcInlheVwiLFwieWF6XCIsXCJ5YmFcIixcInliYlwiLFwieWJkXCIsXCJ5YmVcIixcInliaFwiLFwieWJpXCIsXCJ5YmpcIixcInlia1wiLFwieWJsXCIsXCJ5Ym1cIixcInliblwiLFwieWJvXCIsXCJ5YnhcIixcInlieVwiLFwieWNoXCIsXCJ5Y2xcIixcInljblwiLFwieWNwXCIsXCJ5ZGFcIixcInlkZFwiLFwieWRlXCIsXCJ5ZGdcIixcInlka1wiLFwieWRzXCIsXCJ5ZWFcIixcInllY1wiLFwieWVlXCIsXCJ5ZWlcIixcInllalwiLFwieWVsXCIsXCJ5ZW5cIixcInllclwiLFwieWVzXCIsXCJ5ZXRcIixcInlldVwiLFwieWV2XCIsXCJ5ZXlcIixcInlnYVwiLFwieWdpXCIsXCJ5Z2xcIixcInlnbVwiLFwieWdwXCIsXCJ5Z3JcIixcInlnc1wiLFwieWd1XCIsXCJ5Z3dcIixcInloYVwiLFwieWhkXCIsXCJ5aGxcIixcInloc1wiLFwieWlhXCIsXCJ5aWZcIixcInlpZ1wiLFwieWloXCIsXCJ5aWlcIixcInlpalwiLFwieWlrXCIsXCJ5aWxcIixcInlpbVwiLFwieWluXCIsXCJ5aXBcIixcInlpcVwiLFwieWlyXCIsXCJ5aXNcIixcInlpdFwiLFwieWl1XCIsXCJ5aXZcIixcInlpeFwiLFwieWl5XCIsXCJ5aXpcIixcInlrYVwiLFwieWtnXCIsXCJ5a2lcIixcInlra1wiLFwieWtsXCIsXCJ5a21cIixcInlrblwiLFwieWtvXCIsXCJ5a3JcIixcInlrdFwiLFwieWt1XCIsXCJ5a3lcIixcInlsYVwiLFwieWxiXCIsXCJ5bGVcIixcInlsZ1wiLFwieWxpXCIsXCJ5bGxcIixcInlsbVwiLFwieWxuXCIsXCJ5bG9cIixcInlsclwiLFwieWx1XCIsXCJ5bHlcIixcInltYVwiLFwieW1iXCIsXCJ5bWNcIixcInltZFwiLFwieW1lXCIsXCJ5bWdcIixcInltaFwiLFwieW1pXCIsXCJ5bWtcIixcInltbFwiLFwieW1tXCIsXCJ5bW5cIixcInltb1wiLFwieW1wXCIsXCJ5bXFcIixcInltclwiLFwieW1zXCIsXCJ5bXRcIixcInlteFwiLFwieW16XCIsXCJ5bmFcIixcInluZFwiLFwieW5lXCIsXCJ5bmdcIixcInluaFwiLFwieW5rXCIsXCJ5bmxcIixcInlublwiLFwieW5vXCIsXCJ5bnFcIixcInluc1wiLFwieW51XCIsXCJ5b2JcIixcInlvZ1wiLFwieW9pXCIsXCJ5b2tcIixcInlvbFwiLFwieW9tXCIsXCJ5b25cIixcInlvc1wiLFwieW90XCIsXCJ5b3hcIixcInlveVwiLFwieXBhXCIsXCJ5cGJcIixcInlwZ1wiLFwieXBoXCIsXCJ5cGtcIixcInlwbVwiLFwieXBuXCIsXCJ5cG9cIixcInlwcFwiLFwieXB6XCIsXCJ5cmFcIixcInlyYlwiLFwieXJlXCIsXCJ5cmlcIixcInlya1wiLFwieXJsXCIsXCJ5cm1cIixcInlyblwiLFwieXJvXCIsXCJ5cnNcIixcInlyd1wiLFwieXJ5XCIsXCJ5c2NcIixcInlzZFwiLFwieXNnXCIsXCJ5c2xcIixcInlzbVwiLFwieXNuXCIsXCJ5c29cIixcInlzcFwiLFwieXNyXCIsXCJ5c3NcIixcInlzeVwiLFwieXRhXCIsXCJ5dGxcIixcInl0cFwiLFwieXR3XCIsXCJ5dHlcIixcInl1YVwiLFwieXViXCIsXCJ5dWNcIixcInl1ZFwiLFwieXVlXCIsXCJ5dWZcIixcInl1Z1wiLFwieXVpXCIsXCJ5dWpcIixcInl1a1wiLFwieXVsXCIsXCJ5dW1cIixcInl1blwiLFwieXVwXCIsXCJ5dXFcIixcInl1clwiLFwieXV0XCIsXCJ5dXVcIixcInl1d1wiLFwieXV4XCIsXCJ5dXlcIixcInl1elwiLFwieXZhXCIsXCJ5dnRcIixcInl3YVwiLFwieXdnXCIsXCJ5d2xcIixcInl3blwiLFwieXdxXCIsXCJ5d3JcIixcInl3dFwiLFwieXd1XCIsXCJ5d3dcIixcInl4YVwiLFwieXhnXCIsXCJ5eGxcIixcInl4bVwiLFwieXh1XCIsXCJ5eHlcIixcInl5clwiLFwieXl1XCIsXCJ5eXpcIixcInl6Z1wiLFwieXprXCJdXG4sWyBcInphXCIsXCJ6aFwiLFwienVcIixcInphYVwiLFwiemFiXCIsXCJ6YWNcIixcInphZFwiLFwiemFlXCIsXCJ6YWZcIixcInphZ1wiLFwiemFoXCIsXCJ6YWlcIixcInphalwiLFwiemFrXCIsXCJ6YWxcIixcInphbVwiLFwiemFvXCIsXCJ6YXBcIixcInphcVwiLFwiemFyXCIsXCJ6YXNcIixcInphdFwiLFwiemF1XCIsXCJ6YXZcIixcInphd1wiLFwiemF4XCIsXCJ6YXlcIixcInphelwiLFwiemJhXCIsXCJ6YmNcIixcInpiZVwiLFwiemJsXCIsXCJ6YnRcIixcInpidVwiLFwiemJ3XCIsXCJ6Y2FcIixcInpjaFwiLFwiemRqXCIsXCJ6ZWFcIixcInplZ1wiLFwiemVoXCIsXCJ6ZW5cIixcInpnYVwiLFwiemdiXCIsXCJ6Z2hcIixcInpnbVwiLFwiemduXCIsXCJ6Z3JcIixcInpoYlwiLFwiemhkXCIsXCJ6aGlcIixcInpoblwiLFwiemh3XCIsXCJ6aHhcIixcInppYVwiLFwiemliXCIsXCJ6aWtcIixcInppbFwiLFwiemltXCIsXCJ6aW5cIixcInppclwiLFwieml3XCIsXCJ6aXpcIixcInprYVwiLFwiemtiXCIsXCJ6a2RcIixcInprZ1wiLFwiemtoXCIsXCJ6a2tcIixcInprblwiLFwiemtvXCIsXCJ6a3BcIixcInprclwiLFwiemt0XCIsXCJ6a3VcIixcInprdlwiLFwiemt6XCIsXCJ6bGFcIixcInpsZVwiLFwiemxqXCIsXCJ6bG1cIixcInpsblwiLFwiemxxXCIsXCJ6bHNcIixcInpsd1wiLFwiem1hXCIsXCJ6bWJcIixcInptY1wiLFwiem1kXCIsXCJ6bWVcIixcInptZlwiLFwiem1nXCIsXCJ6bWhcIixcInptaVwiLFwiem1qXCIsXCJ6bWtcIixcInptbFwiLFwiem1tXCIsXCJ6bW5cIixcInptb1wiLFwiem1wXCIsXCJ6bXFcIixcInptclwiLFwiem1zXCIsXCJ6bXRcIixcInptdVwiLFwiem12XCIsXCJ6bXdcIixcInpteFwiLFwiem15XCIsXCJ6bXpcIixcInpuYVwiLFwiem5kXCIsXCJ6bmVcIixcInpuZ1wiLFwiem5rXCIsXCJ6bnNcIixcInpvY1wiLFwiem9oXCIsXCJ6b21cIixcInpvb1wiLFwiem9xXCIsXCJ6b3JcIixcInpvc1wiLFwienBhXCIsXCJ6cGJcIixcInpwY1wiLFwienBkXCIsXCJ6cGVcIixcInpwZlwiLFwienBnXCIsXCJ6cGhcIixcInpwaVwiLFwienBqXCIsXCJ6cGtcIixcInpwbFwiLFwienBtXCIsXCJ6cG5cIixcInpwb1wiLFwienBwXCIsXCJ6cHFcIixcInpwclwiLFwienBzXCIsXCJ6cHRcIixcInpwdVwiLFwienB2XCIsXCJ6cHdcIixcInpweFwiLFwienB5XCIsXCJ6cHpcIixcInpxZVwiLFwienJhXCIsXCJ6cmdcIixcInpyblwiLFwienJvXCIsXCJ6cnBcIixcInpyc1wiLFwienNhXCIsXCJ6c2tcIixcInpzbFwiLFwienNtXCIsXCJ6c3JcIixcInpzdVwiLFwienRlXCIsXCJ6dGdcIixcInp0bFwiLFwienRtXCIsXCJ6dG5cIixcInp0cFwiLFwienRxXCIsXCJ6dHNcIixcInp0dFwiLFwienR1XCIsXCJ6dHhcIixcInp0eVwiLFwienVhXCIsXCJ6dWhcIixcInp1bVwiLFwienVuXCIsXCJ6dXlcIixcInp3YVwiLFwienh4XCIsXCJ6eWJcIixcInp5Z1wiLFwienlqXCIsXCJ6eW5cIixcInp5cFwiLFwienphXCIsXCJ6empcIl1cbl07XG5cblxuZXhwb3J0IGNsYXNzIExhbmdVdGlsIHtcblxuICAgIC8qIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBCQ1AgNDcgc3RyaW5nICovXG4gICAgcHVibGljIHN0YXRpYyBpc0JjcDQ3KGxhbmdTdHI6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIC9eKChbYS16QS1aXXsyLDN9KC1bYS16QS1aXSgtW2EtekEtWl17M30pezAsMn0pP3xbYS16QS1aXXs0fXxbYS16QS1aXXs1LDh9KSgtW2EtekEtWl17NH0pPygtKFthLXpBLVpdezJ9fFswLTldezN9KSk/KC0oWzAtOWEtekEtWl17NSw4fXxbMC05XVthLXpBLVpdezN9KSkqKC1bMC05YS13eS16QS1XWS1aXSgtW2EtekEtWjAtOV17Miw4fSkrKSooLXgoLVthLXpBLVowLTldezEsOH0pKyk/fHgoLVthLXpBLVowLTldezEsOH0pK3woZW4tR0Itb2VkfGktYW1pfGktYm5ufGktZGVmYXVsdHxpLWVub2NoaWFufGktaGFrfGkta2xpbmdvbnxpLWx1eHxpLW1pbmdvfGktbmF2YWpvfGktcHdufGktdGFvfGktdGF5fGktdHN1fHNnbi1CRS1GUnxzZ24tQkUtTkx8c2duLUNILURFfGFydC1sb2piYW58Y2VsLWdhdWxpc2h8bm8tYm9rfG5vLW55bnx6aC1ndW95dXx6aC1oYWtrYXx6aC1taW58emgtbWluLW5hbnx6aC14aWFuZykpJC8udGVzdChsYW5nU3RyKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHByaW1hcnkgPSBsYW5nU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChwcmltYXJ5LmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgcHJpbWFyeSA9IHByaW1hcnkuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwcmltYXJ5Lm1hdGNoKC9bYS16XXsyLDN9LykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBxYWEuLnF0elxuICAgICAgICBpZiAocHJpbWFyeS5sZW5ndGggPT09IDMgXG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJBdCgwKSA9PT0gXCJxXCJcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckNvZGVBdCgxKSA+PSA5NyAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMSkgPD0gMTE2XG4gICAgICAgICAgICAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMikgPj0gOTcgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDIpIDw9IDEyMikge1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZFByaW1hcnlMYW5nc1twcmltYXJ5LmNoYXJDb2RlQXQoMCktOTddLmluY2x1ZGVzKHByaW1hcnkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWF0Y2hQcmltYXJ5TGFuZyhsYW5nMTogc3RyaW5nLCBsYW5nMjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBwcmltYXJ5MSA9IGxhbmcxO1xuICAgICAgICBpZiAocHJpbWFyeTEuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5MSA9IHByaW1hcnkxLnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcmltYXJ5MiA9IGxhbmcyO1xuICAgICAgICBpZiAocHJpbWFyeTIuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5MiA9IHByaW1hcnkyLnNwbGl0KFwiLVwiKVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmltYXJ5MS50b0xvd2VyQ2FzZSgpID09PSBwcmltYXJ5Mi50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElNYXBwZXIsIElNYXBSZXN1bHQsIEJvdW5kcyB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1vbk1hcHBlciBpbXBsZW1lbnRzIElNYXBwZXIge1xuICAgIGFic3RyYWN0IGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmc7XG4gICAgYWJzdHJhY3QgZ2V0TmFtZXNwYWNlKCkgOiBzdHJpbmc7XG4gICAgYWJzdHJhY3QgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfTtcblxuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlSb2xlIDogc3RyaW5nW10gPSBudWxsO1xuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlQYXRoOiBBcnJheTx7XG4gICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIHJvbGVDb3VudDoge1xuICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICB9XG4gICAgfT4gPSBudWxsO1xuICAgIHByb3RlY3RlZCBoaWVyYXJjaHlSZXN1bHRzOiBJTWFwUmVzdWx0W10gPSBudWxsO1xuXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmVzZXQobm9kZTogTm9kZSkge1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aCA9IFt7XG4gICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHJvbGVDb3VudDoge31cbiAgICAgICAgfV07XG5cbiAgICAgICAgbGV0IGFuY2VzdG9ycyA6IE5vZGVbXSA9IFtdO1xuICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBhbmNlc3RvcnMucHVzaChwYXJlbnQpO1xuICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBhbmNlc3RvcnMgPSBhbmNlc3RvcnMucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGFuY2VzdG9yIG9mIGFuY2VzdG9ycykge1xuICAgICAgICAgICAgbGV0IHNpYmxpbmdzID0gW107XG4gICAgICAgICAgICBsZXQgc2libGluZyA9IGFuY2VzdG9yLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaWJsaW5ncyA9IHNpYmxpbmdzLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2libGluZyBvZiBzaWJsaW5ncykge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcEhpZXJhcmNoeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KGFuY2VzdG9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwdXNoSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgbGV0IHJvbGUgOiBzdHJpbmcgPSB0aGlzLmdldFJvbGUobm9kZSkgfHwgXCJub25lXCI7XG4gICAgICAgIHRoaXMuaGllcmFyY2h5Um9sZS5wdXNoKHJvbGUpO1xuICAgICAgICBpZiAocm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRQYXRoSW5mbyA9IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdO1xuICAgICAgICAgICAgcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdID0gKHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSB8fCAwKSArIDE7IFxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnB1c2goe1xuICAgICAgICAgICAgICAgIFwicm9sZVBhdGhcIjogcGFyZW50UGF0aEluZm8ucm9sZVBhdGgrXCIvXCIrcm9sZStcIltcIitwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0rXCJdXCIsXG4gICAgICAgICAgICAgICAgXCJyb2xlQ291bnRcIjoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGF0dHIgPSB7fVxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlcyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgcm9sZTogcm9sZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHIsXG4gICAgICAgICAgICByb2xlUGF0aDogdGhpcy5oaWVyYXJjaHlQYXRoW3RoaXMuaGllcmFyY2h5UGF0aC5sZW5ndGgtMV0ucm9sZVBhdGgsXG4gICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKG5vZGUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBvcEhpZXJhcmNoeSgpIHtcbiAgICAgICAgbGV0IHJvbGUgPSB0aGlzLmhpZXJhcmNoeVJvbGUucG9wKCk7XG4gICAgICAgIGlmIChyb2xlICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cy5wb3AoKTtcbiAgICB9XG5cbiAgICBvcGVuU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGlmICh0aGlzLmhpZXJhcmNoeVJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KG5vZGUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5UmVzdWx0cztcbiAgICB9XG5cbiAgICBjbG9zZVNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBsZXQgcmV0VmFsIDogSU1hcFJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHRoaXMuaGllcmFyY2h5UmVzdWx0cykge1xuICAgICAgICAgICAgLy8gY29uc3QgdGVtcCA9IHJlcy5ub2RlO1xuICAgICAgICAgICAgLy8gcmVzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gbGV0IGNsb25lZCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgICAgICAvLyBjbG9uZWQubm9kZSA9IHJlcy5ub2RlID0gdGVtcDsgXG4gICAgICAgICAgICAvLyByZXRWYWwucHVzaChjbG9uZWQpO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2gocmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICB0aGlzLnBvcEhpZXJhcmNoeSgpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuLi9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lFbmdpbmVcIjtcblxuLy8gQ29udGV4dCB0aGF0IHdpbGwgY2F1c2UgdGhpcyBydWxlIHRvIGV4ZWN1dGUuIFxuLy8gQ29udGV4dCBzeW50YXg6XG4vLyAgIFRyaWdnZXJzOlxuLy8gICAgIGFyaWE6cm9sZSAtIFRyaWdnZXJzIG9uIGVsZW1lbnQgd2l0aCBBUklBIHJvbGUgcm9sZVxuLy8gICAgIGFyaWE6cm9sZVthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0aGUgZXF1aXZhbGVudCBsb2dpY2FsIFxuLy8gICAgICAgYXJpYS0gYXR0cmlidXRlIChlLmcuLCBidXR0b25bZGlzYWJsZWRdIHdpbGwgdHJpZ2dlciBvbiBcbi8vICAgICAgIDxidXR0b24gZGlzYWJsZWQ+IG9yIDxkaXYgcm9sZT1cImJ1dHRvblwiIGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCI+KVxuLy8gICAgIHJvbGVbYXR0cmlidXRlPXZhbHVlXSAtIFNpbWlsYXIgdG8gYWJvdmUsIHdpdGggY2FzZS1zZW5zaXRpdmUgbWF0Y2hcbi8vICAgICAgIHRvIHZhbHVlXG4vLyAgICAgcm9sZVthdHRyaWJ1dGV+dmFsdWVdIC0gU2ltaWxhciB0byBhYm92ZSwgd2l0aCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoXG4vLyAgICAgZG9tOmVsZW1lbnQgLSBUcmlnZ2VycyBvbiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lXG4vLyAgICAgZG9tOmVsZW1lbnRbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGEgZG9tIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuLy8gICAgIGRvbToqW2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBhbGwgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZVxuLy8gICBDb21iaW5pbmcgdHJpZ2dlcnM6XG4vLyAgICAgdHJpZ2dlcjEgdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGhpbiBhbiBcbi8vICAgICAgIGVsZW1lbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgICF0cmlnZ2VyMSB0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgbm90IHdpdGhpblxuLy8gICAgICAgZWxlbWVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjE+dHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIGFuIGltbWVkaWF0ZSBwYXJlbnQgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIHRyaWdnZXIxK3RyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiB3aXRoIGFuXG4vLyAgICAgICBpbW1lZGlhdGUgcHJldmlvdXMgc2libGluZyB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjF+dHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIHNvbWUgZWFybGllciBzaWJsaW5nIHdpdGggdHJpZ2dlcjFcbi8vICAgICBjb250ZXh0LGNvbnRleHQgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIGVpdGhlciBjb250ZXh0XG5leHBvcnQgY2xhc3MgQXR0ckluZm8ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5jbHVzaXZlOiBib29sZWFuLFxuICAgICAgICBwdWJsaWMgYXR0cjogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgZXE/OiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyB2YWx1ZT86IHN0cmluZ1xuICAgICkge1xuICAgICAgICBpZiAoIWluY2x1c2l2ZSBcbiAgICAgICAgICAgICAgICAmJiAoKHR5cGVvZiBlcSkgIT09IFwidW5kZWZpbmVkXCIgJiYgZXEubGVuZ3RoID4gMCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlICFhdHRyXCIrZXErXCIgY29udGV4dFwiKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1c2l2ZSAmJiAodHlwZW9mIGVxKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlcS5sZW5ndGggPiAwICYmICgodHlwZW9mIHZhbHVlKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB2YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaGF2ZSBlcXVpdmFsZW5jZSBjaGVjayB3aXRob3V0IGEgdmFsdWVcIik7ICAgIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoZXMoY29udGV4dDogSU1hcFJlc3VsdCkge1xuICAgICAgICBjb25zdCBydWxlQXR0clBhcnQgPSB0aGlzOyBcbiAgICAgICAgY29uc3QgZWxlbUF0dHJzID0gY29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoIShydWxlQXR0clBhcnQuYXR0ciBpbiBlbGVtQXR0cnMpKSB7XG4gICAgICAgICAgICByZXR1cm4gIXJ1bGVBdHRyUGFydC5pbmNsdXNpdmVcbiAgICAgICAgfSBlbHNlIGlmICghcnVsZUF0dHJQYXJ0LmluY2x1c2l2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKCFydWxlQXR0clBhcnQuZXEpIHtcbiAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBtYXRjaCBhbmQgSSBoYXZlIHRoYXQgYXR0cmlidXRlIGFuZCBubyBlcXVpdmFsZW5jZSBkZWZpbmVkXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBtYXRjaCBhbmQgSSBoYXZlIHRoYXQgYXR0cmlidXRlIGFuZCBlcXVpdmFsZW5jZSBkZWZpbmVkXG4gICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBlbGVtQXR0cnNbcnVsZUF0dHJQYXJ0LmF0dHJdO1xuICAgICAgICAgICAgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlID09PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCIhPVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSAhPT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiflwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSA9PT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQXR0clBhcnQuZXEgPT09IFwiIX5cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgIT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBlcXVpdmFsZW5jZSBvcGVyYXRvciBub3Qgc3VwcG9ydGVkXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJ0SW5mbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbmNsdXNpdmU6IGJvb2xlYW4sIFxuICAgICAgICBwdWJsaWMgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyByb2xlOiBzdHJpbmcsIFxuICAgICAgICBwdWJsaWMgYXR0cnM6IEF0dHJJbmZvW10sIFxuICAgICAgICBwdWJsaWMgY29ubmVjdG9yOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcIipcIiAmJiAhaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiISogY29udGV4dCBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyggXG4gICAgICAgIGNvbnRleHRIaWVyOiBSdWxlQ29udGV4dEhpZXJhcmNoeSxcbiAgICAgICAgaGllckxldmVsOiBudW1iZXIpIDogYm9vbGVhbiBcbiAgICB7XG4gICAgICAgIGNvbnN0IHJ1bGVQYXJ0ID0gdGhpcztcbiAgICAgICAgbGV0IHJ1bGVSb2xlTWF0Y2ggPSAocnVsZVBhcnQubmFtZXNwYWNlIGluIGNvbnRleHRIaWVyKSAmJiBjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF1cbiAgICAgICAgICAgICYmIChjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gcnVsZVBhcnQucm9sZVxuICAgICAgICAgICAgICAgIHx8IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlICE9PSBcIm5vbmVcIiAmJiBydWxlUGFydC5yb2xlID09PSBcIipcIik7XG4gICAgICAgIGlmIChydWxlUm9sZU1hdGNoIFxuICAgICAgICAgICAgJiYgcnVsZVBhcnQucm9sZSA9PT0gXCIqXCIgXG4gICAgICAgICAgICAmJiBydWxlUGFydC5uYW1lc3BhY2UgPT09IFwiZG9tXCIgXG4gICAgICAgICAgICAmJiAoY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IFwiI3RleHRcIlxuICAgICAgICAgICAgICAgIHx8IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBcIi8jdGV4dFwiKSkge1xuICAgICAgICAgICAgcnVsZVJvbGVNYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlUGFydC5pbmNsdXNpdmUgJiYgIXJ1bGVSb2xlTWF0Y2gpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFydWxlUGFydC5pbmNsdXNpdmUgJiYgIXJ1bGVSb2xlTWF0Y2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIE1hdGNoIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IHJ1bGVBdHRycyA9IHJ1bGVQYXJ0LmF0dHJzO1xuICAgICAgICBjb25zdCBlbGVtQ29udGV4dCA9IGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXTtcbiAgICAgICAgbGV0IG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlQXR0clBhcnQgb2YgcnVsZUF0dHJzKSB7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoICYmIHJ1bGVBdHRyUGFydC5tYXRjaGVzKGVsZW1Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVQYXJ0LmluY2x1c2l2ZSkgbWF0Y2ggPSAhbWF0Y2g7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRleHQge1xuICAgIGNvbnRleHRJbmZvIDogUGFydEluZm9bXSA9IFtdXG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGNvbnRleHRIaWVyTWF0Y2hlcyA6IHN0cmluZ1tdID0gY29udGV4dC5tYXRjaCgvIT9bL2EtekEtWjowLTkqXFwtX10rKFxcW1teXFxdXStcXF0pKlsgPit+XT8vZyk7XG4gICAgICAgIGxldCByZXN1bHRzIDogUGFydEluZm9bXSA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBjb250ZXh0SGllck1hdGNoZXMpIHtcbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IHBhcnQubWF0Y2goLyghPykoWy9hLXpBLVo6MC05KlxcLV9dKykoKFxcW1teXFxdXStcXF0pKikoWyA+K35dPykvKTtcbiAgICAgICAgICAgIGxldCBhdHRySW5mbyA6IEF0dHJJbmZvW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0clBhcnQgb2YgcGFydHNbM10ubWF0Y2goL1xcWyhbXlxcXV0rKVxcXS9nKSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyUGFydHMgPSBhdHRyUGFydC5tYXRjaCgvXFxbKCE/KShbYS16OkEtWipcXC1fXSspKCE/Wz1+XSk/KFteXFxdXSspP1xcXS8pO1xuICAgICAgICAgICAgICAgIGF0dHJJbmZvLnB1c2gobmV3IEF0dHJJbmZvKFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbMV0gIT09IFwiIVwiLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbMl0udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzNdLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbNF1cbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnRzWzJdID0gcGFydHNbMl0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG5zUGFydHMgPSBwYXJ0c1syXS5zcGxpdChcIjpcIik7XG4gICAgICAgICAgICBsZXQgaW5jbCA9IHBhcnRzWzFdICE9PSBcIiFcIjtcbiAgICAgICAgICAgIGNvbnN0IG5zID0gbnNQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBuc1BhcnRzLmpvaW4oXCI6XCIpO1xuICAgICAgICAgICAgbGV0IHBhcnRJbmZvID0gbmV3IFBhcnRJbmZvKGluY2wsIG5zLCByb2xlLCBhdHRySW5mbywgcGFydHNbcGFydHMubGVuZ3RoLTFdKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJ0SW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0SW5mbyA9IHJlc3VsdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuQ29udGV4dChjb250ZXh0OiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArIS9nLCBcIiAhXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKyhbPit+LF0pL2csIFwiJDFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyhbPit+LF0pICsvZywgXCIkMVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICsvZywgXCIgXCIpO1xuICAgICAgICByZXR1cm4gY29udGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGNvbnRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgY29udGV4dHMgPSBDb250ZXh0LnNwbGl0TXVsdGlwbGUoQ29udGV4dC5jbGVhbkNvbnRleHQoY29udGV4dCkpO1xuXG4gICAgICAgIGxldCByZXRWYWwgOiBDb250ZXh0W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgY3R4ID0gbmV3IENvbnRleHQoY29udGV4dHNbaV0pO1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goY3R4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5pdGlhbCBwcm9jZXNzaW5nIG9mIHNwbGl0dGluZyBvbiBjb21tYSAtIGNvbnRleHQsY29udGV4dFxuICAgICAqIEBwYXJhbSBjb250ZXh0IFxuICAgICAqL1xuICAgIHN0YXRpYyBzcGxpdE11bHRpcGxlKGNvbnRleHQ6IHN0cmluZykgOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjb250ZXh0cyA9IFtdO1xuICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuaW5kZXhPZihcIixcIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbnRleHQuc3BsaXQoXCIsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0cztcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBJc3N1ZSwgUnVsZSwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUmVzdWx0LCBlUnVsZUNvbmZpZGVuY2UgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBIZWxwTWFwLCBJRW5naW5lLCBObHNNYXAgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IElNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IFJlcG9ydCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSVJlcG9ydFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcblxuY2xhc3MgV3JhcHBlZFJ1bGUge1xuICAgIG5zOiBzdHJpbmc7XG4gICAgaWR4PzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IgKHB1YmxpYyBydWxlOiBSdWxlLCBwdWJsaWMgcGFyc2VkSW5mbyA6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5ucyA9IHRoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mb1t0aGlzLnBhcnNlZEluZm8uY29udGV4dEluZm8ubGVuZ3RoLTFdLm5hbWVzcGFjZTtcbiAgICAgICAgQ29uZmlnLkRFQlVHICYmIGNvbnNvbGUubG9nKFwiQWRkZWQgUnVsZTpcIiwgcnVsZS5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZWRJbmZvKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBjb252ZXJ0aW5nIHRoZSBub2RlIGludG8gYSBzbmlwcGV0IHdoaWNoIGNhbiBiZSBhZGRlZCB0byByZXBvcnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgbm9kZSBhbmQgZXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCB0aGUgYXR0cmlidXRlcyBhbmQgYnVpbGQgdGhlIHNuaXBwZXQgYmFzZWQgb24gdGhpcy5cbiAgICAgKlxuICAgICAqIFRPRE86IEZ1dHVyZSwgbWF5YmUgd2UgY2FuIGV4dHJhY3QgbW9yZSB0aGVuIGp1c3Qgc2luZ2xlIGxpbmUsIGFkZCBtb3JlIGluZm8gb3IgZXZlbiBhZGQgY2xvc2luZyB0YWdzIGV0Yy4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBodG1sIGVsZW1lbnQgdG8gY29udmVydCBpbnRvIGVsZW1lbnQgc25pcHBldCB3aXRoIG5vZGUgbmFtZSBhbmQgYXR0cmlidXRlcyBvbmx5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBub2RlU25pcHBldCAtIHJldHVybiB0aGUgZWxlbWVudCBzbmlwcGV0IG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkIHdoaWNoIG9ubHkgY29udGFpbnMsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVuYW1lIGFuZCBhdHRyaWJ1dGVzLiBpLmUuIDx0YWJsZSBpZD1cXFwibGF5b3V0X3RhYmxlMVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9TbmlwcGV0KG5vZGUgOiBFbGVtZW50KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIHZhciBub2RlU25pcHBldCA9ICcnO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGUgbmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBub2RlIHNuaXBwZXRcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJzwnICsgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSBub2RlIGF0dHJpYnV0ZXMgYXMgYW4gYXJyYXlcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBhdHRyaWJ1dGVzIG9uIHRoaXMgbm9kZVxuICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXMgIT09IG51bGwgJiYgdHlwZW9mIG5vZGVBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZXNlcyBhdHRyaWJ1dGVzIGFuZCBhZGQgdGhlIG5hbWUgYW5kIHZhbHVlIHRvIHRoZSBub2RlU25pcHBldCB3aGljaCB3aWxsIGJlIHJldHVybmVkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZUF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSA9PT0gXCJkYXRhLW5hbWV3YWxrXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgICAgICAgICAgICAgIG5vZGVTbmlwcGV0ICs9ICcgJyArIG5vZGVBdHRyaWJ1dGVzW2ldLm5hbWUgKyAnPVwiJyArIG5vZGVBdHRyaWJ1dGVzW2ldLnZhbHVlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsb3NlIHRoZSBub2RlXG4gICAgICAgIG5vZGVTbmlwcGV0ICs9ICc+JztcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICByZXR1cm4gbm9kZVNuaXBwZXQ7XG4gICAgfVxuXG4gICAgcnVuKGVuZ2luZTogRW5naW5lLCBjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBJc3N1ZVtdIHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGxldCByZXN1bHRzOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucnVsZS5ydW4oY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBFcnJvciA9IGU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUlVMRSBFWENFUFRJT046XCIsdGhpcy5ydWxlLmlkLCBjb250ZXh0LmRvbS5yb2xlUGF0aCwgZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdHMpIHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBpZiAoIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gW3Jlc3VsdHNdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgOiBJc3N1ZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmdpbmUuZ2V0TWVzc2FnZSh0aGlzLnJ1bGUuaWQsIHJlc3VsdC5yZWFzb25JZCwgcmVzdWx0Lm1lc3NhZ2VBcmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbnMgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHBhdGhbbnNdID0gY29udGV4dFtuc10ucm9sZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJ1bGVJZCA9IHRoaXMucnVsZS5pZC5yZXBsYWNlKC9eKC4qKVxcJFxcJFxcZCskLywgXCIkMVwiKTtcblxuICAgICAgICAgICAgcmV0VmFsLnB1c2goe1xuICAgICAgICAgICAgICAgIHJ1bGVJZDogcnVsZUlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgbm9kZTogY29udGV4dFtcImRvbVwiXS5ub2RlLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZVRpbWU6IGVuZFRpbWUtc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIHJlYXNvbklkOiByZXN1bHQucmVhc29uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQXJnczogcmVzdWx0Lm1lc3NhZ2VBcmdzLFxuICAgICAgICAgICAgICAgIGFwaUFyZ3M6IHJlc3VsdC5hcGlBcmdzLFxuICAgICAgICAgICAgICAgIGJvdW5kczogY29udGV4dFtcImRvbVwiXS5ib3VuZHMsXG4gICAgICAgICAgICAgICAgc25pcHBldDogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NuaXBwZXQoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5naW5lIGltcGxlbWVudHMgSUVuZ2luZSB7XG4gICAgcHVibGljIHN0YXRpYyBnZXRMYW5ndWFnZXMoKSB7XG4gICAgICAgIGNvbnN0IGVudiA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAocHJvY2VzcyBhcyBhbnkpLm5vZGVUeXBlID09PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52O1xuICAgICAgICAvLyBJZiBhbGwgZWxzZSBmYWlscywgZGVmYXVsdCB0byBVUyBFbmdsaXNoXG4gICAgICAgIGxldCBub2RlTGFuZyA9IFwiZW4tVVNcIjtcbiAgICAgICAgaWYgKGVudikge1xuICAgICAgICAgICAgbm9kZUxhbmcgPSBlbnYuTEFORyB8fCBlbnYuTEFOR1VBR0UgfHwgZW52LkxDX0FMTCB8fCBlbnYuTENfTUVTU0FHRVM7XG4gICAgICAgICAgICBpZiAobm9kZUxhbmcgJiYgbm9kZUxhbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG5vZGVMYW5nID0gbm9kZUxhbmcuc3BsaXQoXCIuXCIpWzBdLnJlcGxhY2UoL18vZyxcIi1cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGVMYW5nID0gXCJlbi1VU1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgfHwgW25vZGVMYW5nXTtcbiAgICB9XG4gICAgbWFwcGVycyA6IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBwZXIgfSA9IHt9O1xuICAgIHJ1bGVNYXAgOiB7IFtpZDogc3RyaW5nXTogUnVsZSB9ID0ge307XG4gICAgd3JhcHBlZFJ1bGVNYXAgOiB7IFtpZDogc3RyaW5nXTogV3JhcHBlZFJ1bGUgfSA9IHt9O1xuICAgIG5sc01hcCA6IE5sc01hcCA9IHt9XG4gICAgaGVscE1hcCA6IEhlbHBNYXAgPSB7fVxuXG4gICAgcHJpdmF0ZSBpbmNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgcHJpdmF0ZSBleGNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIE5lZWQgYSBET00gTWFwcGVyIGFzIGEgbWluaW11bVxuICAgICAgICB0aGlzLmFkZE1hcHBlcihuZXcgRE9NTWFwcGVyKCkpO1xuICAgIH1cblxuICAgIHJ1bihyb290OiBEb2N1bWVudCB8IE5vZGUsIG9wdGlvbnM/OiB7fSk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJudWxsIGRvY3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcm9vdCA9IChyb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5vd25lckRvY3VtZW50ICYmICgocm9vdC5vd25lckRvY3VtZW50IGFzIGFueSkuUFRfQ0hFQ0tfSElEREVOX0NPTlRFTlQgPSBmYWxzZSk7XG4gICAgICAgIENhY2hlVXRpbC5jbGVhckNhY2hlcyhyb290KTtcbiAgICAgICAgY29uc3Qgd2Fsa2VyID0gbmV3IERPTVdhbGtlcihyb290LCBmYWxzZSwgcm9vdCwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJldFZhbCA6IFJlcG9ydCA9IHtcbiAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgbnVtRXhlY3V0ZWQ6IDAsXG4gICAgICAgICAgICBydWxlVGltZTogMCxcbiAgICAgICAgICAgIHRvdGFsVGltZTogMFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIC8vIFJlc2V0IHRoZSByb2xlIG1hcHBlcnNcbiAgICAgICAgZm9yIChjb25zdCBuYW1lc3BhY2UgaW4gdGhpcy5tYXBwZXJzKSB7XG4gICAgICAgICAgICB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5yZXNldChyb290KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGNvbnRleHQgZGV0ZWN0b3JcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBjb250ZXh0IGluZm9ybWF0aW9uIGZyb20gdGhlIHJ1bGUgbWFwcGVyc1xuICAgICAgICAgICAgY29uc3QgY29udGV4dEhpZXJhcmNoaWVzIDogUnVsZUNvbnRleHRIaWVyYXJjaHkgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgICAgIGlmICghd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dEhpZXJhcmNoaWVzW25hbWVzcGFjZV0gPSB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5vcGVuU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmFtZXNwYWNlID09PSBcImRvbVwiICYmIHdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIChpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJvb3Qub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdW2NvbnRleHRIaWVyYXJjaGllc1tcImRvbVwiXS5sZW5ndGgtMV0ucm9sZVBhdGggPSBcIi8vKltAaWQ9J1wiK2lkK1wiJ11cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLmNsb3NlU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHdhbGtlci5ub2RlLm5vZGVUeXBlICE9PSAxMSBcbiAgICAgICAgICAgICAgICAmJiAoVmlzVXRpbC5pc05vZGVWaXNpYmxlKHdhbGtlci5ub2RlKVxuICAgICAgICAgICAgICAgICAgICAvLyB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImhlYWRcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcIm1ldGFcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicGFyYW1cIlxuICAgICAgICAgICAgICAgICAgICB8fCAhRE9NVXRpbC5nZXRBbmNlc3Rvcih3YWxrZXIubm9kZSwgW1wiYm9keVwiXSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA6IFJ1bGVDb250ZXh0ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBucyBpbiBjb250ZXh0SGllcmFyY2hpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnNIaWVyID0gY29udGV4dEhpZXJhcmNoaWVzW25zXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEhpZXIgPSBuc0hpZXJbbnNIaWVyLmxlbmd0aC0xXTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFtuc10gPSBsYXN0SGllcjsgXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nUnVsZXMgPSB0aGlzLmdldE1hdGNoaW5nUnVsZXMoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwTWF0Y2ggPSB7fVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2hpbmdSdWxlIG9mIG1hdGNoaW5nUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgbWF0Y2hpbmdSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcE1hdGNoW2RlcF0pIGZ1bGZpbGxzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGZpbGxzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA6IElzc3VlW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IG1hdGNoaW5nUnVsZS5ydW4odGhpcywgY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdyYXBwZXIgc2hvd3MgZXJyb3IgaW4gY29uc29sZS4gU2tpcCB0aGlzIHJ1bGUgYXMgTi9BXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBraWxsIHRoZSBlbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG91dCBvZiBzY29wZSwgaXQgZnVsZmlsbHMgdGhlIGRlcGVuZGVuY3lcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hdGNoW21hdGNoaW5nUnVsZS5ydWxlLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5ydWxlVGltZSArPSByZXN1bHQucnVsZVRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLm51bUV4ZWN1dGVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZVsxXSA9PT0gZVJ1bGVDb25maWRlbmNlLlBBU1MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwTWF0Y2hbcmVzdWx0LnJ1bGVJZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpO1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXMocm9vdCk7XG4gICAgICAgIHJldFZhbC50b3RhbFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKS1zdGFydDtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXRWYWwpO1xuICAgIH1cblxuICAgIGVuYWJsZVJ1bGVzKHJ1bGVJZHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZUlkIGluIHRoaXMucnVsZU1hcCkge1xuICAgICAgICAgICAgdGhpcy5ydWxlTWFwW3J1bGVJZF0uZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcnVsZUlkIG9mIHJ1bGVJZHMgfHwgW10pIHtcbiAgICAgICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiV0FSTklORzogUnVsZSBJZFwiLHJ1bGVJZCxcImNvdWxkIG5vdCBiZSBlbmFibGVkLlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydWxlTWFwW3J1bGVJZF0uZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSdWxlKHJ1bGVJZDogc3RyaW5nKTogUnVsZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bGVNYXBbcnVsZUlkXTtcbiAgICB9XG5cbiAgICBnZXRSdWxlc0lkcygpIDogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcmV0VmFsID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcnVsZUlkIGluIHRoaXMucnVsZU1hcCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2gocnVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIGFkZFJ1bGVzKHJ1bGVzOiBSdWxlW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJ1bGUocnVsZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc29ydFJ1bGVzKCk7XG4gICAgfVxuXG4gICAgYWRkUnVsZShydWxlOiBSdWxlLCBza2lwU29ydD86IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGN0eHMgOkNvbnRleHRbXSA9IENvbnRleHQucGFyc2UocnVsZS5jb250ZXh0KTtcbiAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgIGNvbnN0IHJ1bGVJZCA9IHJ1bGUuaWQ7XG4gICAgICAgIGlmIChydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIldBUk5JTkc6IFJ1bGVcIixydWxlSWQsXCJhbHJlYWR5IGFkZGVkIHRvIGVuZ2luZS4gSWdub3JpbmcuLi5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ydWxlTWFwW3J1bGVJZF0gPSBydWxlO1xuICAgICAgICBmb3IgKGNvbnN0IGN0eCBvZiBjdHhzKSB7XG4gICAgICAgICAgICBsZXQgd3JhcElkID0gcnVsZUlkO1xuICAgICAgICAgICAgaWYgKGlkeCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgd3JhcElkID0gcnVsZUlkK1wiJCRcIitpZHg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICArK2lkeDtcbiAgICAgICAgICAgIGxldCB3cmFwcGVkUnVsZSA9IG5ldyBXcmFwcGVkUnVsZShydWxlLGN0eCk7XG4gICAgICAgICAgICB0aGlzLndyYXBwZWRSdWxlTWFwW3dyYXBJZF0gPSB3cmFwcGVkUnVsZTtcbiAgICAgICAgICAgIGxldCBwYXJ0cyA9IHdyYXBwZWRSdWxlLnBhcnNlZEluZm8uY29udGV4dEluZm87XG4gICAgICAgICAgICBsZXQgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07XG4gICAgICAgICAgICBsZXQgdHJpZ2dlclJvbGUgPSBsYXN0UGFydC5uYW1lc3BhY2UrXCI6XCIrbGFzdFBhcnQucm9sZTtcbiAgICAgICAgICAgIGlmIChsYXN0UGFydC5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluY2xSdWxlc1t0cmlnZ2VyUm9sZV0gPSB0aGlzLmluY2xSdWxlc1t0cmlnZ2VyUm9sZV0gfHwgW107XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdLnB1c2god3JhcHBlZFJ1bGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4Y2xSdWxlc1t0cmlnZ2VyUm9sZV0gPSB0aGlzLmV4Y2xSdWxlc1t0cmlnZ2VyUm9sZV0gfHwgW107XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdLnB1c2god3JhcHBlZFJ1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghc2tpcFNvcnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRSdWxlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3NvcnRSdWxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCByb2xlIGluIHRoaXMuaW5jbFJ1bGVzKSB7XG4gICAgICAgICAgICB0aGlzLmluY2xSdWxlc1tyb2xlXS5zb3J0KChydWxlQTogV3JhcHBlZFJ1bGUsIHJ1bGVCOiBXcmFwcGVkUnVsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0RlcEEgPSBydWxlQS5ydWxlLmRlcGVuZGVuY2llcyAmJiBydWxlQS5ydWxlLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0RlcEIgPSBydWxlQi5ydWxlLmRlcGVuZGVuY2llcyAmJiBydWxlQi5ydWxlLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIC8vIElmIEIgZGVwZW5kcyBvbiBBLCBzb3J0IEEgYmVmb3JlIEJcbiAgICAgICAgICAgICAgICBpZiAoaGFzRGVwQiAmJiBydWxlQi5ydWxlLmRlcGVuZGVuY2llcy5pbmNsdWRlcyhydWxlQS5ydWxlLmlkKSkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIC8vIElmIEEgZGVwZW5kcyBvbiBCLCBzb3J0IEIgYmVmb3JlIEFcbiAgICAgICAgICAgICAgICBpZiAoaGFzRGVwQSAmJiBydWxlQS5ydWxlLmRlcGVuZGVuY2llcy5pbmNsdWRlcyhydWxlQi5ydWxlLmlkKSkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBkb2Vzbid0IG1hdHRlclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByb2xlIGluIHRoaXMuZXhjbFJ1bGVzKSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2xSdWxlc1tyb2xlXS5zb3J0KChydWxlQTogV3JhcHBlZFJ1bGUsIHJ1bGVCOiBXcmFwcGVkUnVsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0RlcEEgPSBydWxlQS5ydWxlLmRlcGVuZGVuY2llcyAmJiBydWxlQS5ydWxlLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0RlcEIgPSBydWxlQi5ydWxlLmRlcGVuZGVuY2llcyAmJiBydWxlQi5ydWxlLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIC8vIElmIEIgZGVwZW5kcyBvbiBBLCBzb3J0IEEgYmVmb3JlIEJcbiAgICAgICAgICAgICAgICBpZiAoaGFzRGVwQiAmJiBydWxlQi5ydWxlLmRlcGVuZGVuY2llcy5pbmNsdWRlcyhydWxlQS5ydWxlLmlkKSkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIC8vIElmIEEgZGVwZW5kcyBvbiBCLCBzb3J0IEIgYmVmb3JlIEFcbiAgICAgICAgICAgICAgICBpZiAoaGFzRGVwQSAmJiBydWxlQS5ydWxlLmRlcGVuZGVuY2llcy5pbmNsdWRlcyhydWxlQi5ydWxlLmlkKSkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBkb2Vzbid0IG1hdHRlclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRObHNNYXAobWFwOiBObHNNYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICB0aGlzLm5sc01hcFtrZXldID0gbWFwW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRIZWxwTWFwKG1hcDogSGVscE1hcCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICAgICAgICAgIHRoaXMuaGVscE1hcFtrZXldID0gbWFwW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRNZXNzYWdlKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcsIG1zZ0FyZ3M/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzcGxpdHRlciA9IHJ1bGVJZC5pbmRleE9mKFwiJCRcIik7XG4gICAgICAgIGlmIChzcGxpdHRlciA+PSAwKSB7XG4gICAgICAgICAgICBydWxlSWQgPSBydWxlSWQuc3Vic3RyaW5nKDAsc3BsaXR0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLm5sc01hcCkpIHJldHVybiBydWxlSWQ7XG4gICAgICAgIGxldCBtZXNzYWdlVGVtcGxhdGUgPSB0aGlzLm5sc01hcFtydWxlSWRdW3J1bGVJZHggfHwgMF07XG4gICAgICAgIGlmICghbWVzc2FnZVRlbXBsYXRlKSByZXR1cm4gcnVsZUlkK1wiX1wiK3J1bGVJZHg7XG4gICAgICAgIHJldHVybiBtZXNzYWdlVGVtcGxhdGUucmVwbGFjZSgvXFx7KFxcZCspXFx9L2csXG4gICAgICAgICAgICAobWF0Y2hlZFN0ciwgbWF0Y2hlZE51bSwgbWF0Y2hlZEluZGV4KSA9PiBtc2dBcmdzW21hdGNoZWROdW1dXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0SGVscChydWxlSWQ6IHN0cmluZywgcmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgYXJjaGl2ZUlkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFhcmNoaXZlSWQpIHtcbiAgICAgICAgICAgIC8vIFNldCB0byB0aGUgbGF0ZXN0XG4gICAgICAgICAgICBhcmNoaXZlSWQgPSBcImxhdGVzdFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtDb25maWcuaGVscFJvb3R9LyR7YXJjaGl2ZUlkfS9kb2Mke3RoaXMuZ2V0SGVscFJlbChydWxlSWQsIHJlYXNvbklkKX1gO1xuICAgIH1cblxuICAgIGdldEhlbHBSZWwocnVsZUlkOiBzdHJpbmcsIHJ1bGVJZHg6IG51bWJlciB8IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzcGxpdHRlciA9IHJ1bGVJZC5pbmRleE9mKFwiJCRcIik7XG4gICAgICAgIGlmIChzcGxpdHRlciA+PSAwKSB7XG4gICAgICAgICAgICBydWxlSWQgPSBydWxlSWQuc3Vic3RyaW5nKDAsc3BsaXR0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLmhlbHBNYXApKSByZXR1cm4gcnVsZUlkO1xuICAgICAgICBydWxlSWR4ID0gcnVsZUlkeCB8fCAwO1xuICAgICAgICBsZXQgaGVscFN0ciA9IG51bGw7XG4gICAgICAgIGlmIChydWxlSWR4IGluIHRoaXMuaGVscE1hcFtydWxlSWRdKSB7XG4gICAgICAgICAgICBoZWxwU3RyID0gdGhpcy5oZWxwTWFwW3J1bGVJZF1bcnVsZUlkeCB8fCAwXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhlbHBTdHIgPSB0aGlzLmhlbHBNYXBbcnVsZUlkXVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGVscFN0cikgcmV0dXJuIHJ1bGVJZCtcIl9cIitydWxlSWR4O1xuICAgICAgICByZXR1cm4gaGVscFN0cjtcbiAgICB9XG5cbiAgICBhZGRNYXBwZXIobWFwcGVyOiBJTWFwcGVyKSB7XG4gICAgICAgIHRoaXMubWFwcGVyc1ttYXBwZXIuZ2V0TmFtZXNwYWNlKCldID0gbWFwcGVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG1hdGNoKHJ1bGU6IFdyYXBwZWRSdWxlLFxuICAgICAgICBjb250ZXh0SGllcjogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhblxuICAgIHtcbiAgICAgICAgbGV0IHJ1bGVQYXJ0cyA9IHJ1bGUucGFyc2VkSW5mby5jb250ZXh0SW5mbztcbiAgICAgICAgbGV0IHBhcnRJZHggPSBydWxlUGFydHMubGVuZ3RoLTE7XG4gICAgICAgIGxldCBjdXJOUyA9IHJ1bGVQYXJ0c1twYXJ0SWR4XS5uYW1lc3BhY2U7XG4gICAgICAgIGxldCBjdXJIaWVyID0gY29udGV4dEhpZXJbY3VyTlNdW2NvbnRleHRIaWVyW2N1ck5TXS5sZW5ndGgtMV07XG4gICAgICAgIGNvbnN0IGNvbnRleHROb2RlID0gY3VySGllci5ub2RlO1xuXG4gICAgICAgIC8vIElmIHRoZSBlbmQgb2YgdGhlIHJ1bGUgcGFydCBkb2Vzbid0IG1hdGNoIHRoZSBlbmQgb2YgdGhlIGhpZXJhcmNoeSwgd2UgZG9uJ3QgaGF2ZSBhIG1hdGNoXG4gICAgICAgIGlmICghcnVsZVBhcnRzW3BhcnRJZHhdLm1hdGNoZXMoY29udGV4dEhpZXIsIGNvbnRleHRIaWVyW2N1ck5TXS5sZW5ndGgtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSB3YXMgb25seSBvbmUgcGFydCwgd2UgaGF2ZSBhIG1hdGNoXG4gICAgICAgIGlmIChydWxlUGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZWVkIHRvIGRlYWwgd2l0aCBwYXJlbnQgcGFydHMuIFRvIHdhbGsgdGhlIGhpZXJhcmNoeSwgdGhlc2UgbmVlZCB0byBiZVxuICAgICAgICAvLyBhbGwgaW4gdGhlIHNhbWUgbmFtZXNwYWNlLiBDb25maXJtIHRoYXQgaXMgdHJ1ZS5cbiAgICAgICAgY3VyTlMgPSBydWxlUGFydHNbMF0ubmFtZXNwYWNlO1xuICAgICAgICBjdXJIaWVyID0gY29udGV4dEhpZXJbY3VyTlNdW2NvbnRleHRIaWVyW2N1ck5TXS5sZW5ndGgtMV07XG4gICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgaWYgKHJ1bGVQYXJ0cy5zbGljZSgwLCBydWxlUGFydHMubGVuZ3RoLTEpLnNvbWUocGFydCA9PiBwYXJ0Lm5hbWVzcGFjZSAhPT0gY3VyTlMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRVJST1JdIFJ1bGUgJHtydWxlLnJ1bGUuaWR9IGhhcyBpbmNvbnNpdGVudCBwYXJlbnQgbmFtZXNwYWNlc2ApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZSB0YXJnZXQgbm9kZSBtYXRjaGVzIHRoZSBlbmQgb2YgdGhlIGhpZXJhcmNoeSwgbW92ZSB1cCBwYXN0IGl0LCBvdGhlcndpc2UsIHN0YXJ0IGF0IHRoZSBlbmRcbiAgICAgICAgbGV0IGhpZXJJZHggPSBjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoIC0gKGN1ckhpZXIubm9kZS5pc1NhbWVOb2RlKGNvbnRleHROb2RlKSA/IDIgOiAxKTtcbiAgICAgICAgd2hpbGUgKGhpZXJJZHggPj0gMCAmJiBwYXJ0SWR4ID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBydWxlUGFydHNbcGFydElkeF07XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzUGFydCA9IHJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBoaWVySWR4KTtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNvbm5lY3RvciA9PT0gXCI+XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXNQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdCBwYXJlbnQgY2hlY2sgYW5kIGRvZXNuJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdCBwYXJlbnQgY2hlY2sgYW5kIGRvZXMgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgLS1wYXJ0SWR4O1xuICAgICAgICAgICAgICAgICAgICAtLWhpZXJJZHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LmNvbm5lY3RvciA9PT0gXCIgXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC5pbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVzaXZlIGFuY2VzdG9yIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLS1wYXJ0SWR4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGRvZXNuJ3QgbWF0Y2gsIGp1c3QgbW92ZSB1cCB0aGUgcm9sZSBoaWVyYXJjaHlcbiAgICAgICAgICAgICAgICAgICAgLS1oaWVySWR4O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1hdGNoZXNQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4Y2x1c2l2ZSBhbmNlc3RvciBtYXRjaCBhbmQgY3VycmVudCBtYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNsdXNpdmUgYW5jZXN0b3IgbWF0Y2ggYW5kIGN1cnJlbnQgZG9lc24ndCBtYXRjaCAtIGNoZWNrIGZvciBvdGhlciBhbmNlc3RvcnNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaElkeCA9IGhpZXJJZHgtMTsgIXBhcmVudE1hdGNoICYmIHNlYXJjaElkeCA+PSAwOyAtLXNlYXJjaElkeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TWF0Y2ggPSAhcnVsZVBhcnRzW3BhcnRJZHhdLm1hdGNoZXMoY29udGV4dEhpZXIsIHNlYXJjaElkeCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE1hdGNoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgLS1wYXJ0SWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBjb25uZWN0b3IgXCIrcGFydC5jb25uZWN0b3IrXCIgaXMgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydElkeCA9PT0gLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNYXRjaGluZ1J1bGVzKGN0eEhpZXIgOiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBXcmFwcGVkUnVsZVtdIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgOiBXcmFwcGVkUnVsZVtdID0gW107XG4gICAgICAgIGZ1bmN0aW9uIGFkZE1hdGNoZXMocnVsZXM6IFdyYXBwZWRSdWxlW10pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLnJ1bGUuZW5hYmxlZCAmJiBFbmdpbmUubWF0Y2gocnVsZSwgY3R4SGllcikpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHJ1bGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGN0eEhpZXIpIHtcbiAgICAgICAgICAgIGxldCByb2xlID0gbnMrXCI6XCIrKGN0eEhpZXJbbnNdLmxlbmd0aCA+IDAgPyBjdHhIaWVyW25zXVtjdHhIaWVyW25zXS5sZW5ndGgtMV0ucm9sZSA6IFwibm9uZVwiKTtcbiAgICAgICAgICAgIGlmIChyb2xlIGluIHRoaXMuaW5jbFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmluY2xSdWxlc1tyb2xlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHhSb2xlIGluIHRoaXMuZXhjbFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHhSb2xlICE9PSByb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5leGNsUnVsZXNbeFJvbGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm9sZSAhPT0gbnMrXCI6bm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGUuc3RhcnRzV2l0aChucytcIjovXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucytcIjovKlwiIGluIHRoaXMuaW5jbFJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuaW5jbFJ1bGVzW25zK1wiOi8qXCJdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5zK1wiOipcIiBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmluY2xSdWxlc1tucytcIjoqXCJdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnREZXBzKG1hdGNoZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvcnRzIHRoZSBydWxlcyBpbiBvcmRlciB0byBleGVjdXRlIGRlcGVuZGVuY2llcyBpbiB0aGUgY29ycmVjdCBvcmRlclxuICAgICAqIEBwYXJhbSBpblJ1bGVzIExpc3Qgb2Ygd3JhcHBlZCBydWxlcyB0byBzb3J0XG4gICAgICogQHJldHVybnMgU29ydGVkIGxpc3Qgb2Ygd3JhcHBlZCBydWxlc1xuICAgICAqL1xuICAgIHNvcnREZXBzKGluUnVsZXM6IFdyYXBwZWRSdWxlW10pIHtcbiAgICAgICAgbGV0IGRlcFJ1bGVzOiBXcmFwcGVkUnVsZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBpblJ1bGVzKSB7XG4gICAgICAgICAgICBkZXBSdWxlcy5wdXNoKHJ1bGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0VmFsIDogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBsZXQgaWRUb1J1bGUgPSB7fTtcbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBydWxlcy4gSWYgdGhhdCBydWxlJ3MgZGVwZW5kZW5jaWVzIGNhbiBiZSBtZXQgYnkgcnVsZXMgYWxyZWFkeSBpbiB0aGUgbGlzdCwgYWRkIGl0IHRvIHRoZSBsaXN0XG4gICAgICAgIC8vIFJlcGVhdCB1bnRpbCBubyBjaGFuZ2VzIGFyZSBtYWRlIHRvIHRoZSBzYXRpc2ZpZWQgbGlzdFxuICAgICAgICAvLyBJZiBhIHJ1bGUgY2Fubm90IGJlIHNhdGlzZmllZCwgaXQgd2lsbCBuZXZlciBleGVjdXRlLCBzbyBpdCBjYW4gYmUgZHJvcHBlZC5cbiAgICAgICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8ZGVwUnVsZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcFJ1bGUgPSBkZXBSdWxlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGlmIChkZXBSdWxlLnJ1bGUuaWQgaW4gaWRUb1J1bGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBhbGxNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMgJiYgZGVwUnVsZS5ydWxlLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwSWQgb2YgZGVwUnVsZS5ydWxlLmRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGVwSWQgaW4gaWRUb1J1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiAoZGVwUnVsZS5ydWxlLnByZXJlcXMgJiYgZGVwUnVsZS5ydWxlLnByZXJlcXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIGRlcFJ1bGUucnVsZS5wcmVyZXFzKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoIShkZXBJZCBpbiBpZFRvUnVsZSkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGlmIChhbGxNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwucHVzaChkZXBSdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWRUb1J1bGVbZGVwUnVsZS5ydWxlLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGRlcFJ1bGVzLnNwbGljZShpZHgtLSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChjaGFuZ2UpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICAgIHN0YXRpYyBERUJVRyA9IGZhbHNlO1xuICAgIHN0YXRpYyBoZWxwUm9vdCA9IFwiaHR0cHM6Ly9hYmxlLmlibS5jb20vcnVsZXMvYXJjaGl2ZXNcIjtcbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY2xhc3MgRE9NTWFwcGVyIGV4dGVuZHMgQ29tbW9uTWFwcGVyIHtcbiAgICBnZXRSb2xlKG5vZGU6IE5vZGUpIDogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgZ2V0TmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImRvbVwiXG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0ge1xuICAgICAgICBsZXQgcmV0VmFsID0ge307XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxlbGVtLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJJbmZvID0gZWxlbS5hdHRyaWJ1dGVzW2lkeF07XG4gICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJJbmZvLm5hbWUudG9Mb3dlckNhc2UoKV0gPSBhdHRySW5mby5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXQgc2NhbGVkIGJvdW5kcyBmb3Igc2NyZWVuc2hvdCBldGMuIGFkanVzdGVkIGZvciBkZXZpY2VQaXhlbFJhdGlvIGFuZCBzY3JvbGxcbiAgICAgKiBAcGFyYW0gbm9kZSBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRCb3VuZHMobm9kZTogTm9kZSkgOiBCb3VuZHMge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSAvKk5vZGUuRUxFTUVOVF9OT0RFKi8pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGJ1bmRzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfQm91bmRzXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChidW5kcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYWRqdXN0bWVudCA9IDE7XG4gICAgICAgICAgICBpZiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgICAgICAgICAgIGFkanVzdG1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBib3VuZHMgPSAobm9kZSBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAgICAgICAgIC8vIERvIGEgY2hlY2sgd2hldGhlciBib3VuZHMgaGFzIHZhbHVlIGFzIHdlIHVzZSBkaWZmZXJlbnQgdG9vbCAoaHRtbFVuaXQsIGJyb3dzZXIpIHRvIGNhbGwgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjcm9sbFkgPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFkgfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIFwibGVmdFwiOiBNYXRoLmNlaWwoKGJvdW5kcy5sZWZ0ICsgc2Nyb2xsWCkgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgXCJ0b3BcIjogTWF0aC5jZWlsKChib3VuZHMudG9wICsgc2Nyb2xsWSkgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgXCJoZWlnaHRcIjogTWF0aC5jZWlsKGJvdW5kcy5oZWlnaHQgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgXCJ3aWR0aFwiOiBNYXRoLmNlaWwoYm91bmRzLndpZHRoICogYWRqdXN0bWVudClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlIGFzIEVsZW1lbnQsIFwiRE9NTWFwcGVyX0JvdW5kc1wiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVuZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHJlYWwgQ1NTIGJvdW5kcyBpbiBjc3MgcGl4ZWxzLCBhZGp1c3RlZCBmb3Igc2Nyb2xsIG9ubHlcbiAgICAgKiBAcGFyYW0gbm9kZSBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRVbmFkanVzdGVkQm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBidW5kcyA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlIGFzIEVsZW1lbnQsIFwiRE9NTWFwcGVyX1VuYWRqdXN0ZWRCb3VuZHNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKGJ1bmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IChub2RlIGFzIEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgLy8gYWRqdXN0ZWQgZm9yIHNjcm9sbCBpZiBhbnlcbiAgICAgICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2Nyb2xsWCA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWCB8fCAwO1xuICAgICAgICAgICAgICAgIGxldCBzY3JvbGxZID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxZIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgICAgICBcImxlZnRcIjogTWF0aC5jZWlsKGJvdW5kcy5sZWZ0ICsgc2Nyb2xsWCksXG4gICAgICAgICAgICAgICAgICAgIFwidG9wXCI6IE1hdGguY2VpbChib3VuZHMudG9wICsgc2Nyb2xsWSksXG4gICAgICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgXCJ3aWR0aFwiOiBNYXRoLmNlaWwoYm91bmRzLndpZHRoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUgYXMgRWxlbWVudCwgXCJET01NYXBwZXJfVW5hZGp1c3RlZEJvdW5kc1wiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVuZHM7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNsYXNzIERPTVV0aWwge1xuICAgIFxuICAgIHN0YXRpYyBoYXNQYXJlbnQobm9kZTogTm9kZSwgbmFtZXM6c3RyaW5nW10pIHtcbiAgICAgICAgbGV0IHAgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKTtcbiAgICAgICAgd2hpbGUgKHAgJiYgIW5hbWVzLmluY2x1ZGVzKHAubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEhcDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QW5jZXN0b3Iobm9kZTogTm9kZSwgbmFtZXM6c3RyaW5nW10pIHtcbiAgICAgICAgbGV0IHAgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKTtcbiAgICAgICAgd2hpbGUgKHAgJiYgIW5hbWVzLmluY2x1ZGVzKHAubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHAgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2FtZU5vZGUoYTogTm9kZSwgYjogTm9kZSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGEuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGEuaXNTYW1lTm9kZShiKTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSA9PT0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCAtIHRyeSBvdXIgYmVzdFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYW5XaGl0ZXNwYWNlKHM6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gcy5yZXBsYWNlKC9bIFxcdFxcclxcbl0vZywgXCIgXCIpLnJlcGxhY2UoLyArL2csXCIgXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhblNwYWNlKHM6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gcy5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50MSBhbmQgZWxlbWVudDIgKGNlbGxzKSBhcmUgaW4gdGhlIHNhbWUgdGFibGVcbiAgICBzdGF0aWMgaXNJblNhbWVUYWJsZShlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROYW1lID0gWyd0YWJsZSddO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50MT0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtZW50MSwgcGFyZW50TmFtZSk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQyPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQyLCBwYXJlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQxICE9PSBudWxsICYmIHBhcmVudDIgIT0gbnVsbCAmJiBET01VdGlsLnNhbWVOb2RlKHBhcmVudDEsIHBhcmVudDIpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHNoYWRvd1Jvb3ROb2RlKG5vZGU6IE5vZGUpIDogTm9kZSB8IG51bGwge1xuICAgICAgICBsZXQgbmQgPSBub2RlO1xuICAgICAgICB3aGlsZSAobmQgIT0gbnVsbCAmJiBuZC5ub2RlVHlwZSAhPT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSBcbiAgICAgICAgICAgIG5kID0gbmQucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIG5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvYmplY3RzLCBidXQgcmV0YWlucyBOb2RlIGF0dHJpYnV0ZXMgYXMgcmVmZXJlbmNlc1xuICAgICAqIEBwYXJhbSByaHMgXG4gICAgICovXG4gICAgc3RhdGljIG9iamVjdENvcHlXaXRoTm9kZVJlZnMocmhzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFyaHMpIHJldHVybiByaHM7XG4gICAgICAgIGlmICh0eXBlb2YgcmhzICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJocyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmhzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocmhzIGluc3RhbmNlb2YgTm9kZSB8fCAhIXJocy5ub2RlVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJocztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZXRWYWw7XG4gICAgICAgICAgICBpZiAocmhzLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiQXJyYXlcIikge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2godGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKGl0ZW0pKTtcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2tleV0gPSB0aGlzLm9iamVjdENvcHlXaXRoTm9kZVJlZnMocmhzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyTmFtZSwgYXR0clZhbHVlKSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiAoPEVsZW1lbnQ+d2Fsa05vZGUpLmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgPT09IGF0dHJWYWx1ZSkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92NC91dGlsL1Zpc1V0aWxcIjtcbi8qKlxuICogV2Fsa3MgaW4gYSBET00gb3JkZXJcbiAqIFxuICogQXNzdW1wdGlvbiB0aGF0IG5vZGVzIG9mIHNoYWRvdyBET01zIGNhbGwgYXNzaWduU2xvdHMgb24gdGhlIHNoYWRvdyByb290IGJlZm9yZSBcbiAqIGRvaW5nIG90aGVyIHByb2Nlc3NpbmcgaW4gdGhhdCB0cmVlLiBJZiB5b3Ugd2FsayBpbnRvIGEgc2hhZG93IHJvb3QsIHRoZSBET01XYWxrZXJcbiAqIHdpbGwgZG8gaXQgYXV0b21hdGljYWxseS5cbiAqIFxuICogU2VlIGFsc28gLi4vYXJpYS9BUklBV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBET01XYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG4gICAgY29uc2lkZXJIaWRkZW46IGJvb2xlYW47XG4gICAgREVCVUc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUsIGNvbnNpZGVySGlkZGVuPyA6IGJvb2xlYW4sIERFQlVHPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLkRFQlVHID0gISFERUJVRztcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCAoKGVsZW1lbnQgJiYgZWxlbWVudC5vd25lckRvY3VtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6IGVsZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy5yb290Lm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSAodGhpcy5yb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29uc2lkZXJIaWRkZW4gPSBjb25zaWRlckhpZGRlbiB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBlbGVtKCkgOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmIHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCB8fCBudWxsO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgcGFyZW50Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcCA6IE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICgobm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcCA9IChub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICB9IGVsc2UgaWYgKChub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBwID0gKG5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAocCAmJiBwLm5vZGVUeXBlID09PSAxMSkge1xuICAgICAgICAgICAgaWYgKChwIGFzIFNoYWRvd1Jvb3QpLmhvc3QpIHtcbiAgICAgICAgICAgICAgICBwID0gKHAgYXMgU2hhZG93Um9vdCkuaG9zdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcmVudEVsZW1lbnQobm9kZTogTm9kZSkgOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCBlbGVtIDogRWxlbWVudCA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgZG8geyBcbiAgICAgICAgICAgIGVsZW0gPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtKSBhcyBFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChlbGVtICYmIGVsZW0ubm9kZVR5cGUgIT09IDEpO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXNzaWduU2xvdHMocm9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBsZXQgc2xvdHMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuICAgICAgICBmb3IgKGxldCBpU2xvdD0wOyBpU2xvdDxzbG90cy5sZW5ndGg7ICsraVNsb3QpIHtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzU2xvdCA9IHNsb3RzW2lTbG90XTtcbiAgICAgICAgICAgIGxldCBhc3NpZ25lZE5vZGVzID0gcHJvY2Vzc1Nsb3QuYXNzaWduZWROb2RlcygpO1xuICAgICAgICAgICAgZm9yIChsZXQgaUFzc2lnbmVkPTA7IGlBc3NpZ25lZDxhc3NpZ25lZE5vZGVzLmxlbmd0aDsgKytpQXNzaWduZWQpIHtcbiAgICAgICAgICAgICAgICAoYXNzaWduZWROb2Rlc1tpQXNzaWduZWRdIGFzIGFueSkuc2xvdE93bmVyID0gcHJvY2Vzc1Nsb3Q7XG4gICAgICAgICAgICAgICAgKGFzc2lnbmVkTm9kZXNbaUFzc2lnbmVkXSBhcyBhbnkpLnNsb3RJbmRleCA9IGlBc3NpZ25lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmaXJzdENoaWxkTm90T3duZWRCeVNsb3Qobm9kZTogTm9kZSkge1xuICAgICAgICBsZXQgcmV0VmFsID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBsYXN0Q2hpbGROb3RPd25lZEJ5U2xvdChub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLmxhc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKHJldFZhbCAmJiAocmV0VmFsIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICByZXRWYWwgPSByZXRWYWwucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIG5leHRTaWJsaW5nTm90T3duZWRCeVNsb3Qobm9kZTpOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChub2RlOk5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5vd25lckVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc1NhbWVOb2RlKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMubm9kZSkgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIERFQlVHSURYID0gMDtcbiAgICBpbmRlbnQgPSAwO1xuICAgIG5leHROb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHMgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDx0aGlzLmluZGVudDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBzICs9IFwiIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IERCRyA9IGZhbHNlOy8vdGhpcy5ERUJVR0lEWCA+PSA3ICYmIHRoaXMuREVCVUdJRFggPD0gMTA7XG4gICAgICAgIGxldCBzdGFydE5hbWUgPSB0aGlzLm5vZGUubm9kZU5hbWU7XG4gICAgICAgIGlmICghdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBkbyB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMubm9kZS5ub2RlTmFtZSwgdGhpcy5iRW5kVGFnP1wiRU5EXCI6XCJTVEFSVFwiLCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBhbnkpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSAodGhpcy5ub2RlIGFzIEhUTUxTbG90RWxlbWVudClcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUludG8gRnJhbWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY29uc2lkZXJIaWRkZW4gPyBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFJbnRvIHNoYWRvdyByb290XCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBET01XYWxrZXIuYXNzaWduU2xvdHModGhpcy5ub2RlIGFzIFNoYWRvd1Jvb3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFJbnRvIHNsb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhRmlyc3QgY2hpbGRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5maXJzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFGbGlwIHRvIGVuZCB0YWdcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISExXCIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIURvbmUgYXQgcm9vdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4KzE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTbG90SW5kZXggPCBzbG90T3duZXIuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhTmV4dCBzbG90IGNoaWxkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtuZXh0U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhQmFjayB1cCB0byBzbG90IG93bmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFVcCB0byBmcmFtZSBvd25lclwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERPTVdhbGtlci5uZXh0U2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhTmV4dCBzaWJsaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIVBhcmVudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhRG9uZSB3aXRoIHdhbGtcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoREJHICYmIChcbiAgICAgICAgICAgICAgICAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMTEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAzIClcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ERUJVRyAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgPCR7dGhpcy5iRW5kVGFnP1wiL1wiOlwiXCJ9JHt0aGlzLm5vZGUubm9kZU5hbWV9PiAoZnJvbSAke3N0YXJ0TmFtZX0pICR7dGhpcy5ERUJVR0lEWCsrfSBTS0lQUEVEYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyApXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHRoaXMuaW5kZW50IC09IDI7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYDwke3RoaXMuYkVuZFRhZz9cIi9cIjpcIlwifSR7dGhpcy5ub2RlLm5vZGVOYW1lfT4gKGZyb20gJHtzdGFydE5hbWV9KSAke3RoaXMuREVCVUdJRFgrK31gKTtcbiAgICAgICAgdGhpcy5ERUJVRyAmJiAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2BzbG90T3duZXI6ICR7KHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lci5ub2RlTmFtZX1gKTtcbiAgICAgICAgdGhpcy5ERUJVRyAmJiAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4ICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2BzbG90SW5kZXg6ICR7KHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleH1gKTtcbiAgICAgICAgdGhpcy5ERUJVRyAmJiAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2Bvd25lckVsZW1lbnQ6ICR7KHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudC5ub2RlTmFtZX1gKTtcbiAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHRoaXMuaW5kZW50ICs9IDI7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByZXZOb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY29uc2lkZXJIaWRkZW4gPyBWaXNVdGlsLmlzTm9kZVZpc2libGUoaWZyYW1lTm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QubGFzdENoaWxkKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIubGFzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIubGFzdENoaWxkTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYXBwZXIgZXh0ZW5kcyBDb21tb25NYXBwZXIge1xuICAgIGdldFJvbGUobm9kZTogTm9kZSkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJjb21wdXRlZFwiO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiY3NzXCJcbiAgICB9XG4gICAgZ2V0QXR0cmlidXRlcyhub2RlOiBOb2RlKSA6IHsgW2tleTpzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgICAgIGxldCByZXRWYWwgPSB7fTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxzdHlsZS5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHN0eWxlW2lkeF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICByZXRWYWxbbmFtZV0gPSBzdHlsZVtuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgZVJ1bGVQb2xpY3kgfSBmcm9tIFwiLi9JUnVsZVwiXG5cbmV4cG9ydCBlbnVtIGVUb29sa2l0TGV2ZWwge1xuICAgIExFVkVMX09ORSA9IFwiMVwiLFxuICAgIExFVkVMX1RXTyA9IFwiMlwiLFxuICAgIExFVkVMX1RIUkVFID0gXCIzXCIsXG4gICAgTEVWRUxfRk9VUiA9IFwiNFwiXG59XG5cbmV4cG9ydCBlbnVtIGVHdWlkZWxpbmVDYXRlZ29yeSB7XG4gICAgQUNDRVNTSUJJTElUWSA9IFwiQWNjZXNzaWJpbGl0eVwiLFxuICAgIERFU0lHTiA9IFwiRGVzaWduXCIsXG4gICAgT1RIRVIgPSBcIk90aGVyXCJcbn1cblxuZXhwb3J0IGVudW0gZUd1aWRlbGluZVR5cGUge1xuICAgIERFRkFVTFQgPSBcImRlZmF1bHRcIixcbiAgICBFWFRFTlNJT04gPSBcImV4dGVuc2lvblwiXG59XG5cbmV4cG9ydCB0eXBlIENoZWNrcG9pbnQgPSB7XG4gICAgbnVtOiBzdHJpbmcsXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL2Jsb2IvbWFpbi9zcmMvZGF0YS9zYy11cmxzLmpzb25cbiAgICBzY0lkPzogc3RyaW5nLFxuICAgIC8vIEpDSDogYWRkIG5hbWUgb2YgY2hlY2twb2ludCBhbmQgc3VtbWFyeSBkZXNjcmlwdGlvblxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB3Y2FnTGV2ZWw6IHN0cmluZyxcbiAgICBzdW1tYXJ5OiBzdHJpbmcsXG4gICAgcnVsZXM/OiBBcnJheTx7IFxuICAgICAgICBpZDogc3RyaW5nLCBcbiAgICAgICAgLy8gKG9wdGlvbmFsKSBSZWFzb24gY29kZXMgdGhhdCB0aGlzIHJ1bGVzZXQgbWFwcGluZyBhcHBsaWVzIHRvLCBcbiAgICAgICAgLy8gb3IgYWxsIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgcmVhc29uQ29kZXM/OiBzdHJpbmdbXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LCBcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLFxuICAgICAgICBlbmFibGVkPzogYm9vbGVhblxuICAgIH0+XG59XG5cbmV4cG9ydCB0eXBlIEd1aWRlbGluZSA9IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXRlZ29yeTogZUd1aWRlbGluZUNhdGVnb3J5LFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgdHlwZT86IGVHdWlkZWxpbmVUeXBlLFxuICAgIGNoZWNrcG9pbnRzOiBBcnJheTxDaGVja3BvaW50PlxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBlR3VpZGVsaW5lQ2F0ZWdvcnksIGVHdWlkZWxpbmVUeXBlIH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuL0lNYXBwZXJcIjtcbmltcG9ydCB7IE5sc01hcCBhcyBObHNNYXBOZXcsIEhlbHBNYXAgYXMgSGVscE1hcE5ldywgSUVuZ2luZSBhcyBJRW5naW5lTmV3IH0gZnJvbSBcIi4vSUVuZ2luZVwiO1xuaW1wb3J0IHsgUmVwb3J0IGFzIFJlcG9ydE5ldyB9IGZyb20gXCIuL0lSZXBvcnRcIjtcbmltcG9ydCB7IGVUb29sa2l0TGV2ZWwgYXMgZVRvb2xraXRMZXZlbE5ldyB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIlxuaW1wb3J0IHsgQm91bmRzIH0gZnJvbSBcIi4vSUJvdW5kc1wiO1xuXG5leHBvcnQgZW51bSBlUnVsZUNvbmZpZGVuY2Uge1xuICAgIFBBU1MgPSBcIlBBU1NcIixcbiAgICBGQUlMID0gXCJGQUlMXCIsXG4gICAgUE9URU5USUFMID0gXCJQT1RFTlRJQUxcIixcbiAgICBNQU5VQUwgPSBcIk1BTlVBTFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlUG9saWN5IHtcbiAgICBWSU9MQVRJT04gPSBcIlZJT0xBVElPTlwiLFxuICAgIFJFQ09NTUVOREFUSU9OID0gXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgIElORk9STUFUSU9OID0gXCJJTkZPUk1BVElPTlwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUGFzcyhyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QQVNTXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUmVuZGVyKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogMCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVGYWlsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLkZBSUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQb3RlbnRpYWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUE9URU5USUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlTWFudWFsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLk1BTlVBTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBSdWxlUmVzdWx0ID0ge1xuICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3ksIGVSdWxlQ29uZmlkZW5jZV0sXG4gICAgcmVhc29uSWQ/OiBudW1iZXIgfCBzdHJpbmcsXG4gICAgbWVzc2FnZUFyZ3M/OiBzdHJpbmdbXSxcbiAgICBhcGlBcmdzPzogYW55W11cbn1cblxuZXhwb3J0IHR5cGUgSXNzdWUgPSBSdWxlUmVzdWx0ICYge1xuICAgIHJ1bGVJZDogc3RyaW5nLFxuXG4gICAgbm9kZTogTm9kZSxcbiAgICAvLyBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBjYXRlZ29yeT86IGVHdWlkZWxpbmVDYXRlZ29yeSxcbiAgICBwYXRoOiB7IFtuczogc3RyaW5nXSA6IHN0cmluZyB9LFxuXG4gICAgcnVsZVRpbWU6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYm91bmRzPzogQm91bmRzLFxuICAgIHNuaXBwZXQ6IHN0cmluZyxcbiAgICBsZXZlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBSZXN1bHRbXSB9O1xuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dCA9IHtcbiAgICBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFxufVxuXG5leHBvcnQgdHlwZSBSdWxlID0ge1xuICAgIC8vIFVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhpcyBydWxlIChzaG91bGQgYmUgaHVtYW4gdW5kZXJzdGFuZGFibGUpXG4gICAgLy8gTkxTIGNvZGVzIGFuZCBoZWxwIHNvdXJjZXMgd2lsbCBiZSBiYXNlZCBvZmYgb2YgdGhpcyBpZFxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBydWxlc2V0czogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nIHwgc3RyaW5nW11cbiAgICAgICAgbnVtOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3ksXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbE5ldyxcbiAgICAgICAgLy8gKG9wdGlvbmFsKSBSZWFzb24gY29kZXMgdGhhdCB0aGlzIHJ1bGVzZXQgbWFwcGluZyBhcHBsaWVzIHRvLCBcbiAgICAgICAgLy8gb3IgYWxsIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgcmVhc29uQ29kZXM/OiBzdHJpbmdbXVxuICAgIH0+XG5cbiAgICByZWZhY3Rvcj86IHtcbiAgICAgICAgW29sZFJ1bGVJZDogc3RyaW5nXToge1xuICAgICAgICAgICAgW29sZFJlYXNvbkNvZGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaGVscDoge1xuICAgICAgICBbbG9jYWxlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBcbiAgICAgKiBIb3cgdGhpcyBydWxlIG1hcHMgdG8gQUNUIHJ1bGVzLCBpZiBhbnkgKGh0dHBzOi8vYWN0LXJ1bGVzLmdpdGh1Yi5pby9ydWxlcy8pXG4gICAgICogXG4gICAgICogc3RyaW5nOiBGb3IgYSBzaW5nbGUgcnVsZSBtYXBwaW5nIHRoYXQgbWF0Y2hlcyBleGFjdGx5IHRvIHRoZSBydWxlIChQYXNzIC0+IHBhc3MsIFBvdGVudGlhbCAtPiBjYW50VGVsbCwgRmFpbCAtPiBmYWlsLCB1bmxpc3RlZCA9PiBpbmFwcGxpY2FibGUpXG4gICAgICogQXJyYXk8PjogQ3VzdG9tIG1hcHBpbmcgb2YgcnVsZSB0byBBQ1QgcmVzdWx0c1xuICAgICAqL1xuICAgIGFjdD86IHN0cmluZyB8IHN0cmluZ1tdIHwgQXJyYXk8c3RyaW5nIHwge1xuICAgICAgICBbYWN0UnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IFwicGFzc1wiIHwgXCJmYWlsXCIgfCBcImNhbnRUZWxsXCIgfCBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9PlxuXG4gICAgLy8gU2VlIHNyYy92Mi9jb21tb24vQ29udGV4dC50cyBmb3IgdmFsaWQgY29udGV4dHNcbiAgICBjb250ZXh0OiBzdHJpbmc7XG5cbiAgICAvLyBBcnJheSBvZiBydWxlcyB0aGF0IG11c3QgcGFzcyB0byBhbGxvdyB0aGlzIHZhbGlkYXRlIHRvIHJ1biAtIHRoZXkgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbnRleHQgcHJvcGVydHlcbiAgICBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXVxuXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpID0+IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gfCBudWxsXG5cbiAgICBlbmFibGVkPzogYm9vbGVhblxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVEZXRhaWxzID0gSXNzdWU7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIElFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgUmVwb3J0ID0gUmVwb3J0TmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSBJRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIE5sc01hcCA9IE5sc01hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgSUVuZ2luZVxuICovXG5leHBvcnQgdHlwZSBIZWxwTWFwID0gSGVscE1hcE5ldztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIElFbmdpbmUgPSBJRW5naW5lTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmVcbiAqL1xuZXhwb3J0IHsgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVDYXRlZ29yeVxuICovXG5leHBvcnQgeyBlR3VpZGVsaW5lQ2F0ZWdvcnkgYXMgZVJ1bGVDYXRlZ29yeSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgLi9JR3VpZGVsaW5lOmVHdWlkZWxpbmVUeXBlXG4gKi9cbmV4cG9ydCB7IGVHdWlkZWxpbmVUeXBlIGFzIGVSdWxlc2V0VHlwZSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSBhcyBSdWxlVjQsIGVSdWxlUG9saWN5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uLy4uL3YyL2NvbW1vbi9FbmdpbmVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBTdHlsZU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9zdHlsZS9TdHlsZU1hcHBlclwiO1xuaW1wb3J0IHsgYTExeVJ1bGVzZXRzIH0gZnJvbSBcIi4uL3J1bGVzZXRzXCI7XG5pbXBvcnQgKiBhcyBjaGVja1J1bGVzVjQgZnJvbSBcIi4uL3J1bGVzXCI7XG5pbXBvcnQgeyBHdWlkZWxpbmUsIGVHdWlkZWxpbmVDYXRlZ29yeSB9IGZyb20gXCIuLi9hcGkvSUd1aWRlbGluZVwiO1xuaW1wb3J0IHsgSUVuZ2luZSB9IGZyb20gXCIuLi9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgUmVwb3J0IH0gZnJvbSBcIi4uL2FwaS9JUmVwb3J0XCI7XG5pbXBvcnQgeyBJQ2hlY2tlciB9IGZyb20gXCIuLi9hcGkvSUNoZWNrZXJcIjtcblxubGV0IGNoZWNrUnVsZXMgPSBbXTtcbmxldCBjaGVja05scyA9IHt9O1xubGV0IGNoZWNrSGVscCA9IHt9O1xuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZSgpIHtcbiAgICBjb25zdCBsYW5ncyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoRW5naW5lLmdldExhbmd1YWdlcygpKSk7XG4gICAgLy8gRGVmYXVsdCBsYW5nIHRvIGVuLVVTIGlmIG5vdGhpbmcgZWxzZSBzcGVjaWZpZWQgaXMgZm91bmRcbiAgICBsYW5ncy5wdXNoKFwiZW4tVVNcIik7XG4gICAgLy8gUHJvY2VzcyBWNCBydWxlcyBpbnRvIHRoZSBWMiBmb3JtYXRcbiAgICBmb3IgKGxldCBydWxlbmFtZSBpbiBjaGVja1J1bGVzVjQpIHtcbiAgICAgICAgLy8gQ29udmVydCBydWxlXG4gICAgICAgIGxldCB2NFJ1bGU6IFJ1bGVWNCA9IGNoZWNrUnVsZXNWNFtydWxlbmFtZV07XG4gICAgICAgIGNoZWNrUnVsZXMucHVzaCh2NFJ1bGUpO1xuICAgICAgICAvLyBHbyBiYWNrd2FyZHMgYmVjYXVzZSB0aGUgZmlyc3QgbGFuZyBpcyB0aGUgcHJlZmVycmVkLCBzb1xuICAgICAgICAvLyBlYXJsaWVyIGxhbmd1YWdlcyB3aWxsIG92ZXJyaWRlIGxhdGVyIGxhbmd1YWdlc1xuICAgICAgICBmb3IgKGxldCBpZHg9bGFuZ3MubGVuZ3RoLTE7IGlkeCA+PTA7IC0taWR4KSB7XG4gICAgICAgICAgICBjb25zdCBsYW5nSWQgPSBsYW5nc1tpZHhdO1xuICAgICAgICAgICAgaWYgKGxhbmdJZCBpbiB2NFJ1bGUubWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdID0gdjRSdWxlLm1lc3NhZ2VzW2xhbmdJZF07XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXVswXSA9IGNoZWNrTmxzW3Y0UnVsZS5pZF0uZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGFuZ0lkIGluIHY0UnVsZS5oZWxwKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tIZWxwW3Y0UnVsZS5pZF0gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlYXNvbklkIGluIHY0UnVsZS5oZWxwW2xhbmdJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tIZWxwW3Y0UnVsZS5pZF1bcmVhc29uSWRdID0gYC8ke2xhbmdJZH0vJHt2NFJ1bGUuaGVscFtsYW5nSWRdW3JlYXNvbklkXX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja05sc1t2NFJ1bGUuaWRdWzBdID0gY2hlY2tObHNbdjRSdWxlLmlkXS5ncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDb252ZXJ0IFJTXG4gICAgICAgIGZvciAoY29uc3QgcnNTZWN0aW9uIG9mIHY0UnVsZS5ydWxlc2V0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBycyBvZiBhMTF5UnVsZXNldHMgYXMgR3VpZGVsaW5lW10pIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hlY2tSc0lkcyA6IHN0cmluZ1tdID0gdHlwZW9mIHJzU2VjdGlvbi5pZCA9PT0gXCJzdHJpbmdcIiA/IFtyc1NlY3Rpb24uaWRdIDogcnNTZWN0aW9uLmlkO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja1JzSWRzLmluY2x1ZGVzKHJzLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNwIG9mIHJzLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hlY2tDUElkcyA6IHN0cmluZ1tdID0gdHlwZW9mIHJzU2VjdGlvbi5udW0gPT09IFwic3RyaW5nXCIgPyBbcnNTZWN0aW9uLm51bV0gOiByc1NlY3Rpb24ubnVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ1BJZHMuaW5jbHVkZXMoY3AubnVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLnJ1bGVzID0gY3AucnVsZXMgfHwgW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5ydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHY0UnVsZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uQ29kZXM6IHJzU2VjdGlvbi5yZWFzb25Db2RlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHJzU2VjdGlvbi5sZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGtpdExldmVsOiByc1NlY3Rpb24udG9vbGtpdExldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbl9pbml0aWFsaXplKCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIC4uL2FwaS9JR3VpZGVsaW5lXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVzZXQgPSBHdWlkZWxpbmU7XG5cbmV4cG9ydCBjbGFzcyBDaGVja2VyIGltcGxlbWVudHMgSUNoZWNrZXIge1xuICAgIHByaXZhdGUgZ3VpZGVsaW5lczogR3VpZGVsaW5lW10gPSBbXTtcblxuICAgIGVuZ2luZTogSUVuZ2luZTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0R3VpZGVsaW5lcygpLlxuICAgICAqL1xuICAgIHJ1bGVzZXRzOiBHdWlkZWxpbmVbXSA9IHRoaXMuZ3VpZGVsaW5lcztcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0R3VpZGVsaW5lSWRzKCkuXG4gICAgICovXG4gICAgcnVsZXNldElkczogc3RyaW5nW10gPSBbXTtcbiAgICBydWxlc2V0UnVsZXM6IHsgW3JzSWQ6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7fTtcbiAgICBydWxlTGV2ZWxzIDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDogZVJ1bGVQb2xpY3kgfX0gPSB7fTtcbiAgICBydWxlUmVhc29uTGV2ZWxzIDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDoge1tyZWFzb25Db2Rlczogc3RyaW5nXSA6IGVSdWxlUG9saWN5IH19fSA9IHt9O1xuICAgIHJ1bGVDYXRlZ29yeSA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IGVHdWlkZWxpbmVDYXRlZ29yeSB9fSA9IHt9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBsZXQgZW5naW5lID0gdGhpcy5lbmdpbmUgPSBuZXcgRW5naW5lKCk7XG5cbiAgICAgICAgZW5naW5lLmFkZE1hcHBlcihuZXcgQVJJQU1hcHBlcigpKTtcbiAgICAgICAgZW5naW5lLmFkZE1hcHBlcihuZXcgU3R5bGVNYXBwZXIoKSk7XG5cbiAgICAgICAgZW5naW5lLmFkZFJ1bGVzKGNoZWNrUnVsZXMpO1xuICAgICAgICBlbmdpbmUuYWRkTmxzTWFwKGNoZWNrTmxzKTtcbiAgICAgICAgZW5naW5lLmFkZEhlbHBNYXAoY2hlY2tIZWxwKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJzIG9mIGExMXlSdWxlc2V0cykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlc2V0KHJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBndWlkZWxpbmUgdG8gdGhlIGVuZ2luZS4gSWYgdGhlIGlkIGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMgZ3VpZGVsaW5lIHdpbGwgYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIGd1aWRlbGluZSBcbiAgICAgKi9cbiAgICBhZGRHdWlkZWxpbmUoZ3VpZGVsaW5lOiBHdWlkZWxpbmUpIHtcbiAgICAgICAgaWYgKGd1aWRlbGluZS5pZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVHdWlkZWxpbmUoZ3VpZGVsaW5lLmlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmd1aWRlbGluZXMucHVzaChndWlkZWxpbmUpO1xuICAgICAgICB0aGlzLnJ1bGVzZXRJZHMucHVzaChndWlkZWxpbmUuaWQpO1xuICAgICAgICBjb25zdCBydWxlSWRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZUlkcy5wdXNoKHJ1bGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICAvL3RoaXMucnVsZUxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZUxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSA9IHJ1bGUubGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHJ1bGUucmVhc29uQ29kZXMgPyBydWxlLnJlYXNvbkNvZGVzLmpvaW4oJy0tJykgOiBcIk5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF1bY29kZV0gPSBydWxlLmxldmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSA9IHRoaXMucnVsZUNhdGVnb3J5W3J1bGUuaWRdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXVtndWlkZWxpbmUuaWRdID0gZ3VpZGVsaW5lLmNhdGVnb3J5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVzZXRSdWxlc1tndWlkZWxpbmUuaWRdID0gcnVsZUlkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgYSBydWxlIGZvciBhbGwgZ3VpZGVsaW5lc1xuICAgICAqIEBwYXJhbSBydWxlSWQgXG4gICAgICovXG4gICAgZW5hYmxlUnVsZShydWxlSWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGd1aWRlbGluZSBvZiB0aGlzLmdldEd1aWRlbGluZXMoKSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBydWxlLmVuYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKGd1aWRlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGEgcnVsZSBmb3IgYWxsIGd1aWRlbGluZXNcbiAgICAgKiBAcGFyYW0gcnVsZUlkIFxuICAgICAqL1xuICAgIGRpc2FibGVSdWxlKHJ1bGVJZDogc3RyaW5nKSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3VpZGVsaW5lIG9mIHRoaXMuZ2V0R3VpZGVsaW5lcygpKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBndWlkZWxpbmUuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY3AucnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKGd1aWRlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBndWlkZWxpbmUgZnJvbSB0aGUgZW5naW5lXG4gICAgICogXG4gICAgICogR2VuZXJhbGx5LCB0aGVyZSBpc24ndCBhIGdvb2QgcmVhc29uIHRvIGRvIHRoaXMuIFVzZXJzIHNob3VsZCBqdXN0IG5vdCBzZWxlY3QgdGhlIGd1aWRlbGluZSBhcyBhbiBvcHRpb24gaW4gY2hlY2tcbiAgICAgKiBAcGFyYW0gZ3VpZGVsaW5lSWRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUd1aWRlbGluZShndWlkZWxpbmVJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChndWlkZWxpbmVJZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucnVsZXNldFJ1bGVzW2d1aWRlbGluZUlkXTtcbiAgICAgICAgICAgIHRoaXMucnVsZXNldHMgPSB0aGlzLmd1aWRlbGluZXMgPSB0aGlzLmd1aWRlbGluZXMuZmlsdGVyKGd1aWRlbGluZSA9PiBndWlkZWxpbmUuaWQgIT09IGd1aWRlbGluZUlkKTtcbiAgICAgICAgICAgIHRoaXMucnVsZXNldElkcyA9IHRoaXMuZ2V0R3VpZGVsaW5lSWRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGd1aWRlbGluZXMgYXZhaWxhYmxlIGluIHRoZSBlbmdpbmVcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRHdWlkZWxpbmVzKCkgOiBHdWlkZWxpbmVbXSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZ3VpZGVsaW5lcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaWRzIG9mIHRoZSBndWlkZWxpbmVzIGF2YWlsYWJsZSBpbiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0R3VpZGVsaW5lSWRzKCkgOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWRlbGluZXMubWFwKGd1aWRlbGluZSA9PiBndWlkZWxpbmUuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBkZXByZWNhdGVkIFNlZSBhZGRHdWlkZWxpbmVcbiAgICAgKi9cbiAgICBhZGRSdWxlc2V0KHJzOiBSdWxlc2V0KSB7XG4gICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKHJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGEgY2hlY2sgb2YgdGhlIHNwZWNpZmllZCBub2RlL2RvY3VtZW50XG4gICAgICogQHBhcmFtIG5vZGUgRE9NTm9kZSBvciBEb2N1bWVudCBvbiB3aGljaCB0byBydW4gdGhlIGNoZWNrXG4gICAgICogQHBhcmFtIGd1aWRlbGluZUlkcyBHdWlkZWxpbmUgaWRzIHRvIGNoZWNrIHdpdGggdG8gc3BlY2lmeSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBjaGVjayhub2RlOiBOb2RlIHwgRG9jdW1lbnQsIGd1aWRlbGluZUlkcz86IHN0cmluZyB8IHN0cmluZ1tdKSA6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgICAgbGV0IHJ1bGVJZHMgOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIEZpeCB0aGUgaW5wdXRcbiAgICAgICAgaWYgKCFndWlkZWxpbmVJZHMpIHtcbiAgICAgICAgICAgIHJ1bGVJZHMgPSB0aGlzLmVuZ2luZS5nZXRSdWxlc0lkcygpO1xuICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGd1aWRlbGluZUlkcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGd1aWRlbGluZUlkcyA9IFtndWlkZWxpbmVJZHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgZ3VpZGVsaW5lSWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJzSWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZUlkcyA9IHJ1bGVJZHMuY29uY2F0KHRoaXMucnVsZXNldFJ1bGVzW3JzSWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgXG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVJ1bGVzKHJ1bGVJZHMpO1xuICAgICAgICAvLyBBZGQgdGhlIHJlcG9ydCBsZXZlbHNcbiAgICAgICAgbGV0IG15VGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5ydW4obm9kZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXBvcnQpIHtcbiAgICAgICAgICAgICAgICByZXBvcnQubmxzID0ge31cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlcG9ydC5yZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucnVsZUlkIGluIGNoZWNrTmxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdID0gcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXSB8fCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF1bMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVhc29uSWQgaW4gY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdW3Jlc3VsdC5yZWFzb25JZF0gPSBjaGVja05sc1tyZXN1bHQucnVsZUlkXVtyZXN1bHQucmVhc29uSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vcmVzdWx0LnZhbHVlWzBdID0gbXlUaGlzLmdldExldmVsKGd1aWRlbGluZUlkcyBhcyBzdHJpbmdbXSwgcmVzdWx0LnJ1bGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2RlID0gcmVzdWx0LnJlYXNvbklkPyByZXN1bHQucmVhc29uSWQgYXMgc3RyaW5nIDogXCJOb25lXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YWx1ZVswXSA9IG15VGhpcy5nZXRSZWFzb25MZXZlbChndWlkZWxpbmVJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQsIGNvZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2F0ZWdvcnkgPSBteVRoaXMuZ2V0Q2F0ZWdvcnkoZ3VpZGVsaW5lSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdC5wYXRoLmNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9ydDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgcHJpdmF0ZSBnZXRMZXZlbChyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nKSA6IGVSdWxlUG9saWN5IHtcbiAgICAgICAgaWYgKCFyc0lkcykgcmV0dXJuIGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlTGV2ZWxzW3J1bGVJZF07XG4gICAgICAgIGxldCByZXRWYWwgPSBudWxsO1xuICAgICAgICBpZiAocnNJZHMpIHtcbiAgICAgICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLnJ1bGVMZXZlbHMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnNJbmZvW3JzSWRdID09PSBlUnVsZVBvbGljeS5WSU9MQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlZJT0xBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyc0luZm9bcnNJZF0gPT09IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OICYmIHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZWFzb25MZXZlbChyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nLCByZWFzb25Db2RlPzogc3RyaW5nKSA6IGVSdWxlUG9saWN5IHtcbiAgICAgICAgaWYgKCFyc0lkcykgcmV0dXJuIGVSdWxlUG9saWN5LklORk9STUFUSU9OOyBcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgaWYgKHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlUmVhc29uTGV2ZWxzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb24gXCIrcnVsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZUNvZGUgPSBuZXcgUmVnRXhwKGAoXnwtLSkke3JlYXNvbkNvZGV9KCR8LS0pYCk7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJzSW5mb1tyc0lkXSkuZm9yRWFjaChjb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gJ05vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcnNJbmZvW3JzSWRdW1wiTm9uZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlQ29kZS50ZXN0KGNvZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcnNJbmZvW3JzSWRdW2NvZGVdOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09PSBlUnVsZVBvbGljeS5WSU9MQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OICYmIHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTjsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYXRlZ29yeShyc0lkczogc3RyaW5nW10sIHJ1bGVJZD86IHN0cmluZykgOiBlR3VpZGVsaW5lQ2F0ZWdvcnkge1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUNhdGVnb3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVHdWlkZWxpbmVDYXRlZ29yeS5PVEhFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJzSWRzKSB7XG4gICAgICAgICAgICByc0lkcyA9IHRoaXMuZ2V0R3VpZGVsaW5lSWRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnNJbmZvW3JzSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlR3VpZGVsaW5lQ2F0ZWdvcnkuT1RIRVI7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhX3RhcmdldF93YXJuaW5nOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGFyZ2V0X3dhcm5pbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTphW3RhcmdldF0sZG9tOmFyZWFbdGFyZ2V0XSxkb206YmFzZVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF93YXJuXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuXCI6IGBhX3RhcmdldF93YXJuaW5nLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXJzIHNob3VsZCBiZSB3YXJuZWQgaW4gYWR2YW5jZSBpZiB0aGVpciBpbnB1dCBhY3Rpb24gd2lsbCBvcGVuIGEgbmV3IHdpbmRvd1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHVzZXIgaXMgd2FybmVkIGluIGFkdmFuY2UgdGhhdCB0aGUgaW5wdXQgYWN0aW9uIG9wZW5zIGEgbmV3IHdpbmRvd1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FyblwiOiBcIkluZm9ybSB0aGUgdXNlciB3aGVuIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMy4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBza2lwIHRoZSBydWxlIGlmIGl0J3MgQVQgaGlkZGVuIGFuZCBub3QgdGFiYmFibGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCIsIFwibmV3IHRhYlwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PSBcIl9wYXJlbnRcIiB8fCB0U3RyID09IFwiX3NlbGZcIiB8fCB0U3RyID09IFwiX3RvcFwiIHx8IENvbW1vblV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsdFN0cikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIE5hbWUgaXMgbm90IHBhcnQgb2YgdGhpcyBmcmFtZXNldCDigJMgbXVzdCBoYXZlIHBvdGVudGlhbCB0byBjcmVhdGUgbmV3IHdpbmRvdz9cbiAgICAgICAgICAgIC8vIFNlZSBpZiBhIG5ldyB3aW5kb3cgaXMgbWVudGlvbmVkXG4gICAgICAgICAgICBsZXQgdGV4dFN0ciA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgcGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBpZiAodGV4dFN0ci5pbmRleE9mKHBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3dhcm5cIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYV90ZXh0X3B1cnBvc2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYV90ZXh0X3B1cnBvc2VcIixcbiAgICAvLyBkb2MtYmlibGlvcmVmIGlzIGEgbGlua1xuICAgIGNvbnRleHQ6IFwiYXJpYTpsaW5rLGFyaWE6ZG9jLWJpYmxpb3JlZlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FfSGFzVGV4dFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9hY2NfbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc1wiOiBgYV90ZXh0X3B1cnBvc2UuaHRtbGAsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkh5cGVybGlua3MgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZSBmb3IgdGhlaXIgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiSHlwZXJsaW5rIGhhcyBhIGRlc2NyaXB0aW9uIG9mIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJIeXBlcmxpbmsgaGFzIG5vIGxpbmsgdGV4dCwgbGFiZWwgb3IgaW1hZ2Ugd2l0aCBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi40LjRcIiwgXCI0LjEuMlwiXSwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFwiYzQ4N2FlXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSdWxlIG9ubHkgcGFzc2VzIGlmIGFuIGVsZW1lbnQgaGFzIGlubmVyIGNvbnRlbnQsXG4gICAgICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgb25seSBoaWRkZW4gY29udGVudCB1bmRlciB0aGUgdGhlIGVsZW1lbnQgaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgICAgY29uc3QgYWNjTmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICAoYWNjTmFtZV9wYWlyICYmIGFjY05hbWVfcGFpci5uYW1lICYmIGFjY05hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgIC8qKkFSSUFNYXBwZXIuY29tcHV0ZU5hbWUocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwKi9cbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwubm9uVGFiYWJsZUNoaWxkQ2hlY2socnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9hY2NfbmFtZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYXBwbGV0X2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXBwbGV0X2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcHBsZXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BcHBsZXRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGFwcGxldF9hbHRfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxhcHBsZXQ+IGVsZW1lbnRzIG11c3QgcHJvdmlkZSBhbiAnYWx0JyBhdHRyaWJ1dGUgYW5kIGFuIGFsdGVybmF0aXZlIGRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkFuIDxhcHBsZXQ+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiAnYWx0JyBhdHRyaWJ1dGUgdGhhdCBwcm92aWRlcyBhIHNob3J0IHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgYW4gPGFwcGxldD4gZWxlbWVudCBkdXBsaWNhdGVzIHRoZSAnY29kZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkFuIDxhcHBsZXQ+IGVsZW1lbnQgcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCwgYnV0IGRvZXMgbm90IHByb3ZpZGUgaW5uZXIgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuMS4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBpZiAoIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjb2RlXCIpICYmIGFsdCA9PSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjb2RlXCIpLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcHBsaWNhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcHBsaWNhdGlvbl9Sb2xlX1RleHRcIjoge1xuICAgICAgICAgICAgMDogYEhBQUNfQXBwbGljYXRpb25fUm9sZV9UZXh0Lmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAwOiBgYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJOb24tZGVjb3JhdGl2ZSBzdGF0aWMgdGV4dCBhbmQgaW1hZ2UgY29udGVudCB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBtdXN0IGJlIGFjY2Vzc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgbm9uLWRlY29yYXRpdmUgc3RhdGljIHRleHQgYW5kIGltYWdlIGNvbnRlbnQgd2l0aGluIGFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgYXJlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS4xLjFcIiwgXCIyLjEuMVwiXSwgLy9tYXRjaCBsaXN0aW5nIGluIGhlbHBcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVWaXNpYmxlKGNoaWxkcmVuW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiZG9jdW1lbnRcIikgfHwgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGNoaWxkcmVuW2ldLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcmVhX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJlYV9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YXJlYVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FyZWFfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8YXJlYT4gZWxlbWVudHMgaW4gYW4gaW1hZ2UgbWFwIG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGFyZWE+IGVsZW1lbnQgaW4gYW4gaW1hZ2UgbWFwIGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuMS4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG59XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbHVtbmhlYWRlciwgYXJpYTpmb3JtLCBhcmlhOmhlYWRpbmcsIGFyaWE6cm93aGVhZGVyLCBhcmlhOnRhYmxlLCBhcmlhOmdyYXBoaWNzLWRvY3VtZW50LGFyaWE6Z3JhcGhpY3Mtc3ltYm9sLCBhcmlhOmltZyxhcmlhOmltYWdlLCBkb2MtYmFja2xpbmssIGRvYy1iaWJsaW9lbnRyeSwgZG9jLWJpYmxpb3JlZiwgZG9jLWdsb3NzcmVmLCBkb2Mtbm90ZXJlZiwgZG9jLXBhZ2VicmVhaywgZG9jLWV4YW1wbGVcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQW4gYWNjZXNzaWJsZSBuYW1lIGlzIHByb3ZpZGVkIGZvciB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiOiBcIkVsZW1lbnQgPHswfT4gd2l0aCBcXFwiezF9XFxcIiByb2xlIGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIjogXCJFbGVtZW50IDx7MH0+IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgd2l0aCBjZXJ0YWluIHJvbGVzIHNob3VsZCBoYXZlIGFjY2Vzc2libGUgbmFtZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCJdXG4gICAgfV0sXG4gICAgYWN0OiBbe1wiMjNhMmE4XCI6IHtcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgLy8gc3ZnIGVsZW1lbnQgaXMgaGFuZGxlZCBpbiBzdmdfZ3JhcGhpY3NfbGFiYmVsbGVkIHJ1bGUgYW5kIGltYWdlIHJ1bGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3N2ZycgfHwgbm9kZU5hbWUgPT09ICdpbWcnKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvLyB3aGVuIHRhYmxlIGVsZW1lbnQgd2l0aCBhIGNhcHRpb24gYXMgZmlyc3QgY2hpbGRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGFibGUnIFxuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2NhcHRpb24nXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudCAmJiBydWxlQ29udGV4dC5maXJzdEVsZW1lbnRDaGlsZC50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgY29uc3QgaW52YWxpZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZFJvbGVzICYmIGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlcyAmJiBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIW5hbWVfcGFpciB8fCAhbmFtZV9wYWlyLm5hbWUgfHwgbmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHJvbGUgPT09ICdpbWcnIHx8IHJvbGUgPT09ICdpbWFnZScpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVfaW1hZ2VcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJvbGVdKTsgXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcm9sZV0pO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0ludmFsaWRUYWJpbmRleEZvckFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBzZXQgdG8gXFxcInsxfVxcXCIgaXMgbm90IHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBzaG91bGQgYmUgdGFiYmFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBSdWxlIG5vdCBzdXBwb3J0ZWQgb24gbW9iaWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGJ5IGEgZGlzYWJsZWQgSFRNTDUgYXR0cmlidXRlIG9yIGFyaWEtZGlzYWJsZWQ6XG4gICAgICAgIC8vICAxLiBJbiB0aGUgY2FzZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgYSBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBlbGVtZW50IHN1cHBvcnRzIGl0LCB3ZSBtYXJrIHRoaXMgcnVsZSBhcyBwYXNzZWQuXG4gICAgICAgIC8vICAyLiBJbiB0aGUgY2FzZSB0aGF0IHRoaXMgZWxlbWVudCBoYXMgYW4gYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgdGhlbiwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyBGb3IgYm90aCBvZiB0aGUgY2FzZXMgYWJvdmUgd2UgZG8gbm90IG5lZWQgdG8gcGVyZm9ybSBhbnkgZnVydGhlciBjaGVja3MsIGFzIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIGluIHNvbWUgZm9ybSBvciBhbm90aGVyLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBibGFua1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhYmluZGV4IGF0dHJpYnV0ZSBpcyBwcm92aWRlZCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIDAgb3IgLTFcbiAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgY2hpbGRyZW4gaXMgdGFiYmFibGUuIGluIHRoaXMgY2FzZSwgdGhlIHRhYiB3aWxsIHN0b3Agb24gdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKCFwYXNzZWQpIFxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRUYWJiYWJsZUNoaWxkcmVuKHJ1bGVDb250ZXh0KSA+IDA7XG5cbiAgICAgICAgLy8gQnVpbGQgYXJyYXkgZm9yIG5vZGUgdG9rZW5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChub2RlTmFtZSk7XG5cbiAgICAgICAgLy8gQnVpbGQgYXJyYXkgZm9yIGlkIHJlZmVyZW5jZWQgYnkgYXJpYS1hY3RpdmVkZXNjZW5kYW50XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2gocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLnNwbGl0KFwiIFwiKS5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWFjdGl2ZWRlc2NlbmRhbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjdGl2ZURlc2NlbmRhbnRDaGVja1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgICAgICAvLyBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfNFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCBpcyBub3QgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGVsZW1lbnQgaXMgbm90IGEgdmFsaWQgZGVzY2VuZGFudFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJFbGVtZW50IGlzIGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBjb250cm9sbGVkIGJ5IHRoaXMgY29tcG9uZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IG11c3QgcmVmZXJlbmNlIHRoZSAnaWQnIG9mIGEgbm9uLWVtcHR5LCBub24taGlkZGVuIGFjdGl2ZSBjaGlsZCBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gY29tYm9ib3ggYWN0aXZlIGRlc2NlbmRhbnRzIGhhbmRsZWQgYnkgJ2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50J1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZXNjZW5kYW50X2lkID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgIC8vIFBPRjE6IFRoZSBhdHRyaWJ1dGUgaXMgZW1wdHlcbiAgICAgICAgaWYgKCFkZXNjZW5kYW50X2lkIHx8IGRlc2NlbmRhbnRfaWQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBkZXNjZW5kYW50X2lkLnRyaW0oKSk7XG4gICAgICAgIGlmICghZGVzY2VuZGFudCB8fCBET01VdGlsLnNhbWVOb2RlKGRlc2NlbmRhbnRfaWQsIHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkb2Vzbid0IGV4aXN0LiBXZSBsZXQgMTA3NyB0byB0cmlnZ2VyIHRoZSBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgLy8gUE9GMjogYXJpYS1hY3RpdmVkZXNjZW5kYW50IHJlZmVyZW5jZXMgYSBoaWRkZW4gbm9kZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMS4gVGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcnMgdG8gYW4gZWxlbWVudCB0aGF0IGlzIGVpdGhlciBhIGRlc2NlbmRhbnQgb2YgXG4gICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvZklkID0gMjtcblxuICAgICAgICAvLyBvciBpcyBhIGxvZ2ljYWwgZGVzY2VuZGFudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgIGxldCBvd25lZF9pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bmVkX2lkc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG93bmVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShvd25lZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBvd25lZF9lbGUuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFRoZSBlbGVtZW50IHdpdGggRE9NIGZvY3VzIGlzIGEgdGV4dGJveCB3aXRoIGFyaWEtY29udHJvbHMgcmVmZXJyaW5nIHRvIGFuIGVsZW1lbnQgdGhhdCBcbiAgICAgICAgLy8gIHN1cHBvcnRzIGFyaWEtYWN0aXZlZGVzY2VuZGFudCwgYW5kIHRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgc3BlY2lmaWVkIGZvciB0aGUgXG4gICAgICAgIC8vICB0ZXh0Ym94IHJlZmVycyB0byBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIHRoZSBlbGVtZW50IGNvbnRyb2xsZWQgYnkgdGhlIHRleHRib3ggb3IgaXMgYSBsb2dpY2FsIFxuICAgICAgICAvLyAgZGVzY2VuZGFudCBvZiB0aGF0IGNvbnRyb2xsZWQgZWxlbWVudCBhcyBpbmRpY2F0ZWQgYnkgdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDM7XG4gICAgICAgICAgICBsZXQgY29udHJvbGxlZF9pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbGxlZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbGxlZF9lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgY29udHJvbGxlZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShjb250cm9sbGVkX2VsZSwgcnVsZUNvbnRleHQpICYmIGNvbnRyb2xsZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZWRfZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duc19pZHMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udHJvbGxlZF9lbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG93bnNfaWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bnNfaWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMzogSSdtIG5vdCBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgaXMgbm90IGEgZGVzY2VuZGFudCBhbmQgbm90IG93bmVkIGJ5IHRoZSBlbGVtZW50IFxuICAgICAgICAvLyB0aGF0IHJlZmVyZW5jZWQgaXQuXG4gICAgICAgIGlmIChwb2ZJZCA9PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQXBwbGljYXRpb25MYW5kbWFya3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gQXJpYVV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9BcHBsaWNhdGlvbkxhbmRtYXJrTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFydGljbGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQXJ0aWNsZVJvbGVzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXJ0aWNsZVxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vIEFsc28sIGNvbnNpZGVyIEltcGxpY2l0IHJvbGUgY2hlY2tpbmcuXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJ0aWNsZVwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gQXJpYVV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCA9PT0gXCJcIiB8fCAhKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDE7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBhdHRyaWJ1dGVzIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50J3Mgcm9sZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgYXR0cmlidXRlKHMpICd7MH0nIHJlZmVyZW5jZWQgYnkgdGhlIGVsZW1lbnQgPHsxfT4gaXMgbm90IGEgdmFsaWQgQVJJQSBzdGF0ZSBvciBwcm9wZXJ0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjQuMS4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjVmOTlhN1wiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIFxuICAgICAgICAvLyBUaGlzIGdldHMgYWxsIGVsZW1lbnRzIHdpdGggYXR0cmlidXRlcyBzbyB3ZSBzdGlsbCBoYXZlIHNvbWVcbiAgICAgICAgLy8gT3V0IG9mIFNjb3BlIHNpbmNlIG5vdCBhbGwgYXR0cmlidXRlcyBhcmUgYXJpYSBcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eURhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlcztcbiAgICAgICAgICAgIGxldCBmYWlsZWRQcm9wZXJ0aWVzID0gXCJcIjtcbiAgICAgICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0aWVzID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBqdXN0IGhhdmUgYXJpYSBhdHRyaWJ1dGVzIHdoaWNoIGNhblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIG9yIGZhaWwgYmFzZWQgb24gd2hldGhlciB0aGVyZSBwcm9wZXJ0eSBpcyB2YWxpZFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGVzID0gcHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFUeXBlcykgeyAvLyBpZiBwcm9wZXJ0eSBpcyBub3QgaW4gdmFsaWQgcHJvcGVydHkgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZhaWxlZFByb3BlcnRpZXMgY29tbWEgc2VwIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkUHJvcGVydGllcyA9IGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRQcm9wZXJ0aWVzID0gZmFpbGVkUHJvcGVydGllcyArIFwiLCBcIiArIGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtmYWlsZWRQcm9wZXJ0aWVzLCBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEpDSCAtIHBhc3NpbmcgaXMgYmFzZWQgb24gYWxsIGF0dHJpYnV0ZXMgbm90IGp1c3QgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICAgIC8vICAgICAgIGxlYWRpbmcgdG8gT1ZFUiBDT1VOVElORyBzbyBtb3ZlZCBwYXNzIHVwXG4gICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX2NvbmZsaWN0OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGUgaXMgbm90IGNvbmZsaWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyBpbiBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFhcmlhQXR0cmlidXRlcyB8fCBhcmlhQXR0cmlidXRlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb25mbGljdEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZmxpY3RBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfY29uZmxpY3RcIiwgW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXSwgY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydodG1sQXR0ciddXSkpO1xuICAgICAgICAgICAgaWYgKGFyaWFBdHRyaWJ1dGVzLmluY2x1ZGVzKGNvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXSkpXG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KFtjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2FyaWFBdHRyJ11dLCBhcmlhQXR0cmlidXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcblxuICAgICAgICByZXR1cm4gbnVsbDsgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSBBUklBIHJvbGVzIGFuZCBhdHRyaWJ1dGUgYXJlIHVzZWQgcGVyIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJUaGUgQVJJQSByb2xlIFxcXCJ7MH1cXFwiIGlzIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgZm9yIHRoZSByb2xlIFxcXCJ7MX1cXFwiIGluIHRoZSBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJObyBkZXByZWNhdGVkIEFSSUEgcm9sZSBvciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfcm9sZScsIFtkZXByZWNhdGVkUm9sZXNbaV1dKSk7ICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzICYmIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBcInJvbGVcIjpcImFueVwiLCBcImF0dHJpYnV0ZVwiOmFyaWFBdHRyc1tpXX1cbiAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0ucm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGVdKSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbCgnZmFpbF9yb2xlX2F0dHInLCBbZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0uYXR0cmlidXRlLCBkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlXSkpO1xuICAgICAgICAgICAgfSAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0VtcHR5UHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcIlRoZSBlbGVtZW50IGF0dHJpYnV0ZShzKTogJ3swfScgdmFsdWUgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHNwZWNpZnlpbmcgYSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIG11c3Qgbm90IGJlIGVtcHR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlblxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuXG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm47XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSByZXF1aXJlZFJvbGVQcm9wc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUocmVxdWlyZWRSb2xlUHJvcHNbaV0pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocm9sZSA9PSBcInJhZGlvZ3JvdXBcIikgJiYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT0gXCJwcm9ncmVzc2JhclwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbXTtcbiAgICAgICAgICAgIHBlcm1pdHRlZFJvbGVzLnB1c2gocm9sZSk7XG4gICAgICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHBlcm1pdHRlZFJvbGVzLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gYWxsb3dlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gYWxsb3dlZEF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBcImFyaWEtY2hlY2tlZFwiIHx8IGF0dHJpYnV0ZSA9PSBcImFyaWEtc2VsZWN0ZWRcIiB8fFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPT0gXCJhcmlhLWV4cGFuZGVkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1vcmllbnRhdGlvblwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtbGV2ZWxcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDAgJiYgIWF0dHJOYW1lQXJyLmluY2x1ZGVzKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZW1wdHlfYXR0cmlidXRlXCIsIHJldE1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1yZXF1aXJlZF0sIGRvbToqW2FyaWEtYXV0b2NvbXBsZXRlXSwgZG9tOipbYXJpYS1yZWFkb25seV0sIGRvbToqW2FyaWEtZGlzYWJsZWRdLCBkb206KlthcmlhLXBsYWNlaG9sZGVyXVwiIFxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1jaGVja2VkXSwgZG9tOipbYXJpYS1oaWRkZW5dLCBkb206KlthcmlhLXZhbHVlbWF4XSwgZG9tOipbYXJpYS12YWx1ZW1pbl0sIGRvbToqW2FyaWEtY29sc3Bhbl1cIlxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1yb3dzcGFuXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBpcyBub3QgcmVkdW5kYW50IHdpdGggYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBIVE1MIGF0dHJpYnV0ZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIEFSSUEgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiB0aGUgQVJJQSBhdHRyaWJ1dGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICAgICAgbGV0IGludmFsaWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRBdHRyaWJ1dGVzICYmIGludmFsaWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZiBjb25mbGljdCBhbHJlYWR5IHJlcG9ydGVkLCBpZ25vcmUgcmVwb3J0aW5nIG92ZXJsYXBcbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGNvbmZsaWN0QXR0cmlidXRlcyAmJiBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgICAgICBsZXQgaHRtbEF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIFxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0T3JPdmVybGFwcGluZ0h0bWxBdHRyaWJ1dGUoYXJpYUF0dHJzW2ldLCBodG1sQXR0cnMsICdvdmVybGFwcGluZycpO1xuICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnUGFzcycpIHsgLy9wYXNzXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtWydyZXN1bHQnXSA9PT0gJ0ZhaWxlZCcpIHsgLy9mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3JlZHVuZGFudFwiLCBbYXJpYUF0dHJzW2ldWyduYW1lJ10sIGl0ZW1bJ2F0dHInXV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTsgICAgXG4gICAgICAgIH0gICAgXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZXF1aXJlZFByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbWlzc2luZ1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc1wiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGAsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ1wiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50IHdpdGggYSByb2xlIG11c3QgYmUgZGVmaW5lZFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIHJvbGUgYXJlIGRlZmluZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nXCI6IFwiRWxlbWVudCB3aXRoICd7MH0nIHJvbGUgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgQVJJQSBhdHRyaWJ1dGUocyk6ICd7MX0nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNGU4YWI2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vbGV0IGltcGxpY2l0Um9sZSA9IEFSSUFNYXBwZXIuZWxlbVRvSW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9sZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUm9sZXMgPSAwO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlcXVpcmVkUm9sZVByb3BzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiByZXF1aXJlZFJvbGVQcm9wcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGFsbG93ZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHJvbGUsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCByb2xlTWlzc2luZ1JlcVByb3AgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwcm9wZXJ0aWVzTGVuZ3RoID0gcmVxdWlyZWRSb2xlUHJvcHMubGVuZ3RoOyBpIDwgcHJvcGVydGllc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhbGxvd2VkUm9sZVByb3BzLmluY2x1ZGVzKHJlcXVpcmVkUm9sZVByb3BzW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIHJlcXVpcmVkUm9sZVByb3BzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhcmlhLWxhYmVsbGVkYnkgaXNuJ3QgcHJlc2VudCwgYW4gYXJpYS1sYWJlbCB3aWxsIG1lZXQgdGhlIHJlcXVpcmVtZW50LlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWxhYmVsbGVkYnlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpIHx8IChyb2xlICE9IFwicmFkaW9ncm91cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLXZhbHVlbm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLXZhbHVldGV4dFwiKSkgfHwgKHJvbGUgIT0gXCJwcm9ncmVzc2JhclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWNvbnRyb2xzXCIgJiYgcm9sZSA9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBzaW5jZSBhcmlhLWNvbnRyb2xzIGluIHRoZSB0ZXh0Ym94IG9mIGEgY29tYm9ib3ggaXMgYWxyZWFkeSBoYW5kbGVkIGluIHJ1bGUgSEFBQ19Db21ib2JveF9NdXN0X2hhdmVfVGV4dF9JbnB1dFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTWlzc2luZ1JlcVByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGVNaXNzaW5nUmVxUHJvcCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJvbGVOYW1lQXJyLmxlbmd0aCA9PSAwIHx8IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwOyAvLyBvbmx5IGFyaWEgYXR0cmlidXRlcyBzbyBOTyBPVVQgT0YgU0NPUEVcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nXCIsIHJldFRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSB2YWxpZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdmFsdWUgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciBhdHRyaWJ1dGUgJ3sxfScgb24gZWxlbWVudCA8ezJ9PiBpcyBub3QgdmFsaWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNmE3MjgxXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHZhbHVlQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGF0YVR5cGVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydHlWYWx1ZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBwcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKG5vZGVWYWx1ZSkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKCd1bmRlZmluZWQnKSAhPSAtMSAmJiBub2RlVmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90cmFuc2xhdGUgJ3VuZGVmaW5lZCcgdG8gbWVhbiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyaWEtcmVsZXZhbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzcGFjZSBkZWxpbWl0ZWQgbGlzdCBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9ucywgcmVtb3ZhbHMsIHRleHQ7IG9yIGEgc2luZ2xlIGNhdGNoLWFsbCB2YWx1ZSBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlcyA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGFsbCBpcyBzcGVjaWZpZWQsIGl0IGNhbm5vdCBoYXZlIGFueSBvdGhlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZXMubGVuZ3RoID4gMSAmJiBhdHRyVmFsdWVzLmluY2x1ZGVzKFwiYWxsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNoID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyVmFsdWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbmRpdmlkdWFsIHZhbHVlIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlc1tqXSAhPSBcIlwiICYmICFkYXRhVHlwZXMudmFsdWVzLmluY2x1ZGVzKGF0dHJWYWx1ZXNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaFthdHRyTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChhdHRyVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpVmFsID0gcGFyc2VJbnQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihpVmFsKSB8fCAoXCJcIiArIGlWYWwgIT09IG5vZGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZlZhbCA9IHBhcnNlRmxvYXQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihmVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRtcFYgPSBub2RlVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wViAhPT0gXCJ0cnVlXCIgJiYgdG1wViAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnR5VmFsdWVzLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldE1zZyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIHJldE1zZy5wdXNoKHZhbHVlQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyByZXRNc2cucHVzaCAoZGF0YVR5cGVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YmFubmVyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUJhbm5lckxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gQXJpYVV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Jhbm5lcl9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmhlYWRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfT25lQmFubmVySW5TaWJsaW5nU2V0X0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZm91bmQgb24gdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHBhZ2UsIGRvY3VtZW50LCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJiYW5uZXJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBBcmlhVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkgPT09IG51bGw7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jaGlsZF90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nRm9jdXNhYmxlQ2hpbGRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJmYWlsX21pc3NpbmdfY2hpbGRcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJOb25lIG9mIHRoZSBkZXNjZW5kZW50IGVsZW1lbnRzIHdpdGggXFxcInsxfVxcXCIgcm9sZSBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVJIGNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGRlc2NlbmRhbnQgZm9yIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgfHwgQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBBbiBBUklBIGxpc3QgaXMgbm90IGludGVyYWN0aXZlXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCB7IFwibGlzdFwiOiB0cnVlLCBcInJvd1wiOiB0cnVlLCBcInJvd2dyb3VwXCI6IHRydWUsIFwidGFibGVcIjogdHJ1ZSwgXCJncmlkXCI6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IGEgdmFsaWQgbWVzc2FnZSBmb3IgbW9iaWxlIGJlY2F1c2UgYWxsIGVsZW1lbnRzIGFyZSBmb2N1c2FibGUgaW4gaU9TIHdoZW4gVm9pY2VPdmVyIGlzIGVuYWJsZWQuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIGZvY3VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGNvbWJvYm94XG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgaWQgb2YgdGhlIGVsZW1lbnQgaXMgcmVmZXJlbmNlZCBieSBhbm90aGVyIGVsZW1lbnQgd2l0aCBcImFyaWEtY29udHJvbHNcIiBvciBcImFyaWEtZXhwYW5kZWRcIiBhbmQgd2l0aCBjZXJ0YWluIHJvbGVzLiBJZiBzbywgZm9jdXMgaXMgY29udHJvbGxlZCBieSB0aGUgcmVmZXJlbmNpbmcgZWxlbWVudFxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvKippZiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHM9JyR7aWR9J11bcm9sZT0nY29tYm9ib3gnXWApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW2FyaWEtaGFzcG9wdXA9J3RydWUnXSwgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW2FyaWEtZXhwYW5kZWQ9J3RydWUnXWApO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVycyA9IFsnY29tYm9ib3gnLCAnbGlzdGJveCcsICdtZW51JywgJ21lbnViYXInLCAncmFkaW9ncm91cCcsICd0cmVlJywgJ3RyZWVncmlkJ107XG4gICAgICAgICAgICBpZiAoZWxlbSAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlbSkgJiYgcm9sZXMgJiYgcm9sZXMubGVuZ3RoID4wICYmIHJvbGVzLnNvbWUocj0+Y29udGFpbmVycy5pbmNsdWRlcyhyKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IFwiXCI7XG4gICAgICAgIGxldCBpblNjb3BlID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5jb250YWluZXJzLmluY2x1ZGVzKHJvbGVzW2pdKSkge1xuICAgICAgICAgICAgICAgIGxldCBkaXNhYmxlZCA9IGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtZGlzYWJsZWQnKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgOiAnJztcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWQgIT0gJ3RydWUnICYmICFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKSAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluU2NvcGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAgPSBcImRlc2NlbmRhbnQ6OipbXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHAgKz0gXCJAcm9sZT0nXCIgKyByZXFDaGlsZHJlbltpXSArIFwiJyBvciBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHhwID0geHAuc3Vic3RyaW5nKDAsIHhwLmxlbmd0aCAtIDQpICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0ID0gZG9jLmV2YWx1YXRlKHhwLCBydWxlQ29udGV4dCwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVpcmVkIGNoaWxkIGlzIG5vdCBmb2N1c2FibGUgdmlhIHRhYmluZGV4LiBTZWUgaWYgdGhlcmUgaXMgYSBncmFuZGNoaWxkIHRoYXQgaXMgZm9jdXNhYmxlIGJ5IGRlZmF1bHQgb3IgYnkgdGFiaW5kZXguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocjIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocjIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlTmFtZUFyciA9IHIuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9IHIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZSBhcnJheXMvc3RyaW5ncyBhcmUgZW1wdHksIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBubyB2aW9sYXRpb24gc28gd2UgY2FuIHJlc2V0IGl0IGJhY2sgdG8gcGFzc2VkLCB0aGUgcmVhc29uIGZvciB0aGlzXG4gICAgICAgIC8vIGlzIHRoYXQgd2UgYXJlIHNldHRpbmcgcGFzc2VkPWZhbHNlIHdoaWxlIHdlIHBlcmZvcm0gYSBsb29wIHdoaWNoIGNhdXNlcyB2aW9sYXRpb24gdG8gdHJpZ2dlciBldmVuIGlmIHRoZXJlIGlzIG5vIGlzc3Vlcy4gSW5zdGVhZCBvZlxuICAgICAgICAvLyB1cGRhdGluZyB0aGUgd2hvbGUgcnVsZSB0byBzd2l0Y2ggZnJvbSB1c2luZyBwYXNzZWQgaW4gdGhhdCB3YXkgc2ltcGx5IGRvIHRoZSBjaGVjayBhdCB0aGlzIHBvaW50LlxuICAgICAgICBpZiAobm9kZU5hbWUubGVuZ3RoID4gMCAmJiByb2xlTmFtZUFyci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXRUb2tlbjEucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICByZXRUb2tlbjIucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAoIWluU2NvcGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbWlzc2luZ19jaGlsZFwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NoaWxkX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY2hpbGRfdmFsaWRcIixcbiAgICAvL2NvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICAvL2RlcGVuZGVuY2llczogW1wiUnB0X0FyaWFfVmFsaWRSb2xlXCJdLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV92YWxpZFwiLCBcImFyaWFfZGVzY2VuZGFudF92YWxpZFwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm9fY2hpbGRcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIEFSSUEgcm9sZSBtdXN0IG93biBhIHJlcXVpcmVkIGNoaWxkXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJBbiBlbGVtZW50IHdpdGggYW4gQVJJQSByb2xlIG93bnMgYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vX2NoaWxkXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IG93biBhbnkgY2hpbGQgZWxlbWVudCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIHJvbGUocyk6IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9jaGlsZFwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBvd25zIHRoZSBjaGlsZCBlbGVtZW50IHdpdGggdGhlIHJvbGUgXFxcInsxfVxcXCIgdGhhdCBpcyBub3Qgb25lIG9mIHRoZSBhbGxvd2VkIHJvbGUocyk6IFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFZlcmlmeSBtYXBwaW5nXG4gICAgYWN0OiBbXCJiYzRhNzVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcm9sZXMgPSAgQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBjb250YWlucyBub25lIG9yIHByZXNlbnRhdGlvbiByb2xlXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25Sb2xlcyA9IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl07XG4gICAgICAgIGNvbnN0IGZvdW5kID0gcm9sZXMuc29tZShyPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vICBGb3IgY29tYm9ib3gsIHdlIGhhdmUgZzExOTMgLi4uIGcxMTk5IHRvIGNoZWNrIHRoZSB2YWx1ZXMgZXRjLlxuICAgICAgICAvLyAgV2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIDExNTIgYWdhaW4uIFNvLCB3ZSBieXBhc3MgaXQgaGVyZS5cbiAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiY29tYm9ib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXF1aXJlZENoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSZXF1aXJlZENoaWxkUm9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAvLyBhICdncm91cCcgcm9sZSBpcyBhbGxvd2VkIGJ1dCBub3QgcmVxdWlyZWQgZm9yIHNvbWUgZWxlbWVudHMgc28gcmVtb3ZlIGl0IGlmIGV4aXN0c1xuICAgICAgICBpZiAocmVxdWlyZWRDaGlsZFJvbGVzLmluY2x1ZGVzKCdncm91cCcpKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSByZXF1aXJlZENoaWxkUm9sZXMuaW5kZXhPZignZ3JvdXAnKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2hpbGRSb2xlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKiogIFxuICAgICAgICAgKiBpZ25vcmUgaWYgYSByb2xlIGRvZXNuJ3QgcmVxdWlyZSBhIGNoaWxkIHdpdGggYW55IHNwZWNpZmljIHJvbGVcbiAgICAgICAgICogdGhlIHJldmVyc2UgbWlnaHQgYmUgbm90IHRydWUgLSBwYXJlbnQgd2lsbCBiZSBjaGVja2VkIGluIFJwdF9BcmlhX1JlcXVpcmVkUGFyZW50X05hdGl2ZV9Ib3N0X1NlbWF0aWNzIHJ1bGVcbiAgICAgICAgKi9cbiAgICAgICAgIGlmIChyZXF1aXJlZENoaWxkUm9sZXMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjaGlsZHJlbiBmcm9tIGFjY2Vzc2liaWxpdHkgdHJlZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyBvbmVzIHdpdGggYXJpYS1vd25zICAgIFxuICAgICAgICBsZXQgZGlyZWN0QVRDaGlsZHJlbiA9IEFyaWFVdGlsLmdldERpcmVjdEFUQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFkaXJlY3RBVENoaWxkcmVuIHx8IGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggYXQgbGVhc3Qgb25lIHJlcXVpcmVkIHJvbGUgZG9zZW4ndCBjb250YWluIGFueSBhY2Nlc3NpYmxlIGNoaWxkXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFdoZW4gYSB3aWRnZXQgaXMgbWlzc2luZyByZXF1aXJlZCBvd25lZCBlbGVtZW50cyBkdWUgdG8gc2NyaXB0IGV4ZWN1dGlvbiBvciBsb2FkaW5nLCBcbiAgICAgICAgICAgICAqIGF1dGhvcnMgTVVTVCBtYXJrIGEgY29udGFpbmluZyBlbGVtZW50IHdpdGggJ2FyaWEtYnVzeScgZXF1YWwgdG8gdHJ1ZS4gXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICBsZXQgYnVzeSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYnVzeVwiKTtcbiAgICAgICAgICAgICBpZiAoIWJ1c3kgfHwgYnVzeSAhPT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocmVxdWlyZWRDaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfbm9fY2hpbGRcIiwgcmV0VG9rZW4pO1xuICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgLy8gaXQncyAnYnVzeScgbG9hZGluZywgaWdub3JlIGl0IFxuICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgdmlvbGF0ZUVsZW1Sb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGRpcmVjdEFUQ2hpbGRyZW5bal0sIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgICAgIGlmICghY2hpbGRSb2xlcyB8fCBjaGlsZFJvbGVzLmxlbmd0aCA9PSAwKSBcbiAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShkaXJlY3RBVENoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMgJiYgY2hpbGRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogd2hlbiBtdWx0aXBsZSByb2xlcyBhcmUgc3BlY2lmaWVkIGFzIHJlcXVpcmVkIG93bmVkIGVsZW1lbnRzIGZvciBhIHJvbGUsIGF0IGxlYXN0IG9uZSBpbnN0YW5jZSBvZiBvbmUgcmVxdWlyZWQgb3duZWQgZWxlbWVudCBpcyBleHBlY3RlZC4gXG4gICAgICAgICAgICAgICAgICogdGhlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbiBpbnN0YW5jZSBvZiBlYWNoIG9mIHRoZSBsaXN0ZWQgb3duZWQgcm9sZXMuXG4gICAgICAgICAgICAgICAgICogdGhlcmVmb3JlLCB0aGUgcmVxdWlyZW1lbnQgaXMgbWV0IGlmIGl0IGhhcyBhbnkgb25lIG9mIHRoZSByZXF1aXJlZCByb2xlcy5cbiAgICAgICAgICAgICAgICAgKi8gICAgXG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBjaGlsZFJvbGVzLnNvbWUocj0+IHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgXG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGVFbGVtUm9sZXMucHVzaChjaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7IFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIGVsZW1lbnQgc2luY2UgaXQncyBub3Qgc2VtYW50aWMsIHNob3VsZG4ndCBoYXBwZW4gXG4gICAgICAgICAgICB9ICAgICBcbiAgICAgICAgfSBcbiAgICAgICAgXG4gICAgICAgIGlmICh2aW9sYXRlRWxlbVJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHZpb2xhdGVFbGVtUm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaCh2aW9sYXRlRWxlbVJvbGVzW2ldKTtcbiAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJlcXVpcmVkQ2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX2NoaWxkXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbXBsZW1lbnRhcnlMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBBcmlhVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206YXNpZGVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbXBsZW1lbnRhcnlMYW5kbWFya0xhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiXG4gICAgICAgICk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeVJlcXVpcmVkTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudF9pbl9sYW5kbWFyazogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbnRlbnQgaXMgbm90IHdpdGhpbiBhIGxhbmRtYXJrIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgY29udGVudCBtdXN0IHJlc2lkZSB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIGEgbGFuZG1hcmsgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IENhY2hlVXRpbC5nZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIG51bGwpO1xuICAgICAgICBpZiAoIXBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGxhbmRtYXJrczoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJidXR0b25cIiwgXCJjb21ib2JveFwiLCBcImNoZWNrYm94XCIsIFwiZ3JpZFwiLCBcImhlYWRpbmdcIiwgXCJsaW5rXCIsIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwidGFibGlzdFwiLCBcInRleHRib3hcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cmVlZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcG9zc2libGVPcnBoYW5lZEVsZW1lbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJwXCIsIFwidGFibGVcIiwgXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiYVwiLCBcIm9sXCIsIFwidWxcIiwgXCJkbFwiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaDZcIiwgXCJlbWJlZFwiLCBcIm9iamVjdFwiLCBcImFyZWFcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5vTGFuZG1hcmtlZFJvbGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHJvbGVzIGRvbid0IHJlcXVpcmUgbGFuZG1hcmtzXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiZGlhbG9nXCIsIFwidG9vbHRpcFwiXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYXBMYW5kbWFya3M6IHt9LFxuICAgICAgICAgICAgICAgIG1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHM6IHt9LFxuICAgICAgICAgICAgICAgIG1hcE5vTGFuZG1hcmtlZFJvbGVzOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29udmVydCBhcnJheXMgdG8gbWFwc1xuICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGFuZG1hcmtzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrc1twYXJhbXMubGFuZG1hcmtzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0c1twYXJhbXMucG9zc2libGVPcnBoYW5lZFdpZGdldHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzW3BhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLm5vTGFuZG1hcmtlZFJvbGVzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzW3BhcmFtcy5ub0xhbmRtYXJrZWRSb2xlcy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAgLy8gYXZvaWQgZGlhZ25vc2luZyBnMTE1NyBmb3Igbm9uLXZpc2libGUgbm9kZXNcbiAgICAgICAgICAgIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtc1dpdGhvdXRDb250ZW50ID0gW1wiYXJlYVwiLCBcImlucHV0XCIsIFwiZW1iZWRcIiwgXCJidXR0b25cIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgJiYgLy9vbmx5IHRyaWdnZXIgdGhlIHJ1bGUgb24gZWxlbWVudHMgdGhhdCBoYXZlIGNvbnRlbnRcbiAgICAgICAgICAgIGVsZW1zV2l0aG91dENvbnRlbnQuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7IC8vIGEgZmV3IGVsZW1zIHdpaG91dCBjb250ZW50IHNob3VsZCBub3QgYmUgc2tpcHBlZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQgY2lyY3VpdCBmb3IgbGF5b3V0IHRhYmxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmIFRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHBvc3NpYmxlIG9ycGhhblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cywgdHJ1ZSk7XG4gICAgICAgIC8vZXhjbHVkZSA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cInh5ei5jc3NcIj4gaW4gdGhlIDxoZWFkPiBhbmQgPGJvZHk+KCM2MDgpXG4gICAgICAgIC8vaGF2aW5nIGxpbmsgaW4gdGhlIGhlYWQgY291bGQgY2F1c2UgbG90IG9mIHZpb2xhaW9ucyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2xpbmsnKSB7XG4gICAgICAgICAgICBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50ID0gbm9kZU5hbWUgaW4gcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cztcbiAgICAgICAgaWYgKGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCB8fCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBTZWUgaWYgYW5jZXN0b3IgaGFzIGxhbmRtYXJrIHJvbGVzIG9yIGltcGxpY2l0IGxhbmQgbWFyayByb2xlc1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZXMuZmlsdGVyKHJvbGUgPT4gcm9sZSBpbiBwYXJhbXMubWFwTGFuZG1hcmtzKS5sZW5ndGggPiAwXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGZhaWwgZWxlbWVudHMgd2hlbiBhIHBhcmVudCBvciBzaWJsaW5nIGhhcyBmYWlsZWQgLSBjYXVzZXMgdG9vIG1hbnkgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgbGV0IHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHJ1bGVDb250ZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZSh3YWxrRWxlbWVudCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHdhbGtFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBydWxlQ29udGV4dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHJ1bGUgaWYgZWxlbWVudCBpcyBhIHN0YW5kLWFsb25lIHdpZGdldFxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05vVHJpZ2dlclwiLCBmYWxzZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9Ob1RyaWdnZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbnRlbnRpbmZvXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbnRlbnRpbmZvTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IEFyaWFVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgcnVsZUNvbnRleHQsICcnLCAnJywgWyBteUxhYmVsIF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb250ZW50aW5mb19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206Zm9vdGVyLCBkb206YWRkcmVzc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29udGVudGluZm9XaXRoTm9NYWluX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudGluZm9fbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBwcmVzZW50IHdpdGhvdXQgYW4gZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGlzIG9ubHkgcGVybWl0dGVkIHdpdGggYW4gZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9jb25zaWRlciBpbXBsaWNpdCByb2xlXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkubGVuZ3RoID4gMDtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fc2luZ2xlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmZvb3RlciwgZG9tOmFkZHJlc3NcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29udGVudGluZm9JblNpYmxpbmdTZXRfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGZvdW5kIG9uIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBwYWdlLCBkb2N1bWVudCwgb3IgYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgaGF2ZSBvbmUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL2ZpbmQgb3V0IGlmIDxmb290ZXI+IGVsZW1lbnQgaGFzIHNpYmxpbmdzIGFzIDxmb290ZXI+IGhhcyBpbXBsaWNpdCBjb250ZW50aW5mbyByb2xlXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSAhQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Rlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJCcm93c2VycyBpZ25vcmUgdGhlIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBBUklBIHJvbGVzIG9mIHRoZSBkZXNjZW5kYW50cyBvZiBjZXJ0YWluIGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCBjb250YWlucyB2YWxpZCBkZXNjZW5kYW50c1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIGltcGxpY2l0IHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBWZXJpZnkgbWFwcGluZ1xuICAgIGFjdDogW1wiMzA3bjV6XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCByZXF1aXJlIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIFxuICAgICAgICAgICAgcm9sZXMgPSAgQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGRyZW4gZnJvbSBhY2Nlc3NpYmlsaXR5IHRyZWUsIFxuICAgICAgICAvLyBpbmNsdWRpbmcgb25lcyB3aXRoIGFyaWEtb3ducyAgICBcbiAgICAgICAgbGV0IGRpcmVjdEFUQ2hpbGRyZW4gPSBBcmlhVXRpbC5nZXREaXJlY3RBVENoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRpcmVjdEFUQ2hpbGRyZW4gJiYgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIGF0IGxlYXN0IG9uZSBub24tcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgIGxldCBleHBsaWNpdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSA8aW1nPiBhbmQgPHN2Zz5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBkaXJlY3RBVENoaWxkcmVuW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ2ltZycgfHwgdGFnID09PSAnc3ZnJykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gZ2V0IGV4cGxpY2l0IHJvbGUgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhkaXJlY3RBVENoaWxkcmVuW2pdLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMgJiYgY2hpbGRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0Um9sZXMucHVzaChjaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGltcGxpY2l0IHJvbGUgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkUm9sZXMgPSAgQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZXhwbGljaXRSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKGV4cGxpY2l0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBpbXBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goaW1wbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7ICAgICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmRvY3VtZW50XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZURvY3VtZW50Um9sZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlcyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IEFyaWFVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsID09PSBcIlwiIHx8ICEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMTtcblxuICAgICAgICAvLyByZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdLGRvbToqW29uYmx1cl0sIGRvbToqW29uZGJsY2xpY2tdLCBkb206KltvbmZvY3VzXSwgZG9tOipbb25rZXlkb3duXSxkb206KltvbmtleXByZXNzXSwgZG9tOipbb25rZXl1cF0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW1vdmVdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206KltvbnJlc2l6ZV0sIGRvbToqW29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRXZlbnRIYW5kbGVyTWlzc2luZ1JvbGVfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IHdpdGggJ3sxfScgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBzcGVjaWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoaXMgcnVsZSBpcyBwYXNzZWQgaWYgYSBlbGVtZW50IGhhcyBhdHRyaWJ1dCByb2xlIFxuICAgICAgICAvL2Fsc28sIHBhc3NlZCBvZiBlbGVtZW50IGhhcyBhbnkgaW1wbGljaXQgcm9sZXMuIFxuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzQW55Um9sZShydWxlQ29udGV4dCwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcGFzcyBpZiB0aGlzIGVsZW1lbnQgaXMgcmVjZWl2ZWQgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc2ZvY3VzYWJsZUJ5RGVmYXVsdChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmFsaWRhdGUgaWYgdGhpcyBlbGVtZW50IGhhcyBhbnkgb2YgdGhlIGdpdmVuIGV2ZW50IGhhbmRsZXInc1xuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBsZXQgZXZlbnRBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgLy8gRnJvbSBXQ0FHMjBfU2NyaXB0X1VzZVczQ0RvbUZ1bmN0aW9uc1xuICAgICAgICAvL2xldCBldmVudHMgPSBbXCJvbmJsdXJcIiwgXCJvbmZvY3VzXCIsIFwib25jaGFuZ2VcIiwgXCJvbmNsaWNrXCIsIFwib25jb250ZXh0bWVudVwiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgLy8gICAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbmxvYWRcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ubW91c2V3aGVlbFwiLCBcIm9ucmVzZXRcIiwgXCJvbnBhc3RlXCIsIFwib25yZXNpemVcIiwgXCJvbnNjcm9sbFwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbnNlbGVjdFwiLCBcIm9uc3VibWl0XCIsIFwib25hY3RpdmF0ZVwiLCBcIm9uZGVhY3RpdmF0ZVwiLCBcIm9ubW91c2VlbnRlclwiLCBcIm9ubW91c2VsZWF2ZVwiXTtcbiAgICAgICAgbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmRibGNsaWNrXCIsIFwib25rZXlkb3duXCIsXG4gICAgICAgICAgICBcIm9ua2V5cHJlc3NcIiwgXCJvbmtleXVwXCIsIFwib25tb3VzZWRvd25cIiwgXCJvbm1vdXNldXBcIiwgXCJvbm1vdXNlbW92ZVwiLCBcIm9ubW91c2VvdXRcIixcbiAgICAgICAgICAgIFwib25tb3VzZW92ZXJcIiwgXCJvbnJlc2l6ZVwiXG4gICAgICAgIF07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKGV2ZW50c1tpXSkpXG4gICAgICAgICAgICAgICAgZXZlbnRBcnIucHVzaChldmVudHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2goZXZlbnRBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRm9ybUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICAvLyBmb3JtIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBpZiBpdCBoYXMgYW4gYXJpYSBsYWJlbCBvciB0aXRsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcImZvcm1cIiB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgICAgIGxldCBsYW5kbWFya3MgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZHVwZXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgICAgIGR1cGVzID0gQXJpYVV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG15TGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJlxuICAgICAgICAgICAgICAgICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2dyYXBoaWNfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyYXBoaWNzLWRvY3VtZW50LGFyaWE6Z3JhcGhpY3Mtc3ltYm9sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfU3ZnQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhIGdyYXBoaWNzIHJvbGUgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIGhhcyBubyBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBoYXMgbm8gbGFiZWwgb3IgYW4gZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgbWlzc2luZyBub24tZW1wdHkgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCI3ZDY3MzRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgfHwgIXJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikuaW5jbHVkZXMoXCJncmFwaGljcy1cIikpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIHNpbmNlIGlmIGFuIGVsZW1lbnQgaGFzIHJvbGU9aW1nLCB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGEgY2hlY2sgZm9yIGFsdCBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VjbmUgb2Ygcm9sZT1wcmVzZW50YXRpb25cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuLCA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKV0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2hpZGRlbl9ub250YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0sIGRvbToqW2FyaWEtaGlkZGVuPXRydWVdIGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2hpZGRlbl9mb2N1c19taXN1c2VcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBoaWRkZW4gZWxlbWVudCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHRhYmJhYmxlIGVsZW1lbnRzXCIsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IFxcXCJ7MH1cXFwiIHNob3VsZCBub3QgYmUgZm9jdXNhYmxlIHdpdGhpbiB0aGUgc3VidHJlZSBvZiBhbiBlbGVtZW50IHdpdGggYW4gJ2FyaWEtaGlkZGVuJyBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAndHJ1ZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS4zLjFcIiwgXCI0LjEuMlwiXSwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IEhhbmRsZSB0ZXN0Y2FzZSB3aXRoIGZvY3VzIGp1bXBpbmcgYXdheVxuICAgIGFjdDogXCI2Y2ZhODRcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRJZFJlZlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdpZCcgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciB0aGUgQVJJQSBwcm9wZXJ0eSAnezF9JyB2YWx1ZSBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgQVJJQSBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSBhIG5vbi1lbXB0eSB1bmlxdWUgaWQgb2YgYW4gZXhpc3RpbmcgZWxlbWVudCB0aGF0IGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IDZhNzI4MSAtIE5lZWQgYSBzZXBhcmF0ZSByZWFzb24gY29kZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuIEFDVCBzYXlzIGl0J3Mgb2theSB0byBiZVxuICAgIC8vIGludmFsaWQgd2hlbiBub3QgcmVxdWlyZWQuIEkgdGhpbmsgd2Ugc2hvdWxkIHN0aWxsIGZhaWwsIGJ1dCBmbGFnIGl0IGFzIGEgZGlmZmVyZW50IHJlYXNvbiBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgc3Vic2V0XG4gICAgLy8gYWxpZ25zIHdpdGggQUNULlxuICAgIGFjdDogW1wiNTk3OTZmXCIsIFwiNmE3MjgxXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub25FeGlzdGFudElEcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGlkVG9rZW5zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRSZWZlcmVuY2VzID0gMDtcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhdHRyTGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydHNPbmVJRFJlZiA9IChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgZGF0YSB0eXBlIHN1cHBvcnRzIG9uZSBvciBtb3JlIGlkIHJlZnMgZG8gZXJyb3IgY2hlY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c09uZUlEUmVmIHx8IChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFJlZmVyZW5jZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlTGVuZ3RoID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZEFycmF5ID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhbiBlbXB0eSBJRCBSZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlTGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goXCJcXFwiXCIgKyBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0b28gbWFueSBJRFJlZnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdXBwb3J0c09uZUlEUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgaGFzIHRvbyBtYW55IElEUmVmcyBpdCBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlTGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjYXB0dXJlIGFsbCB0aGUgSURSZWZzIGZvciBpZFRva2Vuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgeiA8IGxlbmd0aDsgKyt6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W3pdICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goaWRBcnJheVt6XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGlkIHJlZnMgYXJlIGludmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyAmJiBub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gaWRBcnJheS5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0ubGVuZ3RoID4gMCkgeyAvLyBpdCBpcyBhbiBlbXB0eSBzdHJpbmcgaWYgc3BhY2VzIGFyZSBvbmUgYWZ0ZXIgdGhlIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IGJ5IElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gb3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZEFycmF5W2pdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGVsZW1lbnRCeUlkICE9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBleGlzdHMgYW5kIHRoaXMgaXMgYW4gYXJpYSBhdHRyaWJ1dGUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2ssIGluIHRoZSBjYXNlIHRoZSBub2RlIGlzIG5vdCB2aXNpYmxlIHRoZW4gd2UgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmICFkYXRhVHlwZXMuaGlkZGVuSURSZWZTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W2pdICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goaWRBcnJheVtqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBvbmUgb2YgdGhlIGlkIHJlZmVyZW5jZXMgbmVlZCB0byBiZSB2YWxpZCB0byBtYXJrIHRoZSBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYgd2UgZmluZCBhIHNpbmdsZSB2aXNpYmxlIGVsZW1lbnQgdGhlbiBzdG9wIGNoZWNraW5nIGFuZCBtYXJrIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuXG4gICAgICAgICAgICByZXRUb2tlbjIucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0VG9rZW4zLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBpZiAoaWRUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKGlkVG9rZW5zLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMiwgcmV0VG9rZW4zXSk7XG4gICAgICAgIGlmICh0ZXN0ZWRSZWZlcmVuY2VzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpLCByZXRUb2tlbjMudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9pbWdfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pbWdfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6aW1nLCBhcmlhOmltYWdlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfSW1nQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgaGFzIG5vIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIGhhcyBubyBsYWJlbCBvciBhbiBlbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtaXNzaW5nIG5vbi1lbXB0eSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXCIyM2EyYThcIiwge1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAvLyBJZiBubyByb2xlLCB0aGlzIGlzIGltcGxpY2l0LCBhbmQgY292ZXJlZCBieSBXQ0FHMjBfSW1nX0hhc0FsdFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBzdmcgYW5kIGltZyBlbGVtZW50cyBhcmUgaGFuZGxlZCBpbiBzdmdfZ3JhcGhpY3NfbGFiYmVsbGVkIGFuZCBpbWdfYWx0X3ZhbGlkIHJ1bGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3N2ZycgfHwgbm9kZU5hbWUgPT09ICdpbWcnKSByZXR1cm47XG5cbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gc2luY2UgaWYgYW4gZWxlbWVudCBoYXMgcm9sZT1pbWcsIHRoZW4gdGhlcmUgbmVlZHMgdG8gYmUgYSBjaGVjayBmb3IgYWx0IGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZWNuZSBvZiByb2xlPXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvKiBKQ0ggLSBQb2ludHMgb2YgZmFpbHVyZVxuICAgICAgICAgKiAgICAwLiBNaXNzaW5nIGFsdCBhdHRyIHdpdGggdmFsdWVcbiAgICAgICAgICogICAgMS4gTWlzc2luZyBhcmlhLWxhYmVsIG9yIGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgKiAgICAyLiBNaXNzaW5nIHRpdGxlIGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHJvbGUgPT09IGltZywgeW91IG11c3QgdXNlIGFuIGFyaWEgbGFiZWxcbiAgICAgICAgLy9jaGVjayBhdHRyaWJ1dGVzIGFyaWEtbGFiZWwgYW5kIGFyaWEtbGFiZWxsZWRieSBmb3Igb3RoZXIgdGFncyAoZS5nLiwgPGRpdj4sIDxzcGFuPiwgZXRjKVxuICAgICAgICBsZXQgcGFzc2VkID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCBzdmdUaXRsZSA9IHJ1bGVDb250ZXh0LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHN2Z1RpdGxlICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KHN2Z1RpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL2NoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIC8vIFdlIHNob3VsZCBndWlkZSBwZW9wbGUgdG8gdXNlIGFsdCBvciBsYWJlbCAtIHRoaXMgaXMganVzdCBhIHNlY29uZGFyeSBhcHByb2FjaCB0byBzaWxlbmNlIHRoZSBydWxlLlxuICAgICAgICAgICAgLy8gU28sIHdlIHNob3VsZCBrZWVwIHRoZSBQT0YgZnJvbSBhYm92ZS5cbiAgICAgICAgICAgIC8vIGlmICghcGFzc2VkKSBQT0YgPSBcIkZhaWxfM1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIilcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nS2V5Ym9hcmRIYW5kbGVyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcIlZlcmlmeSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIGtleWJvYXJkIGFjY2Vzc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIFdBSV9BUklBIFVJIGNvbXBvbmVudHMgbXVzdCBwcm92aWRlIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAvL29ubHkgY29uc2lkZXIgdXNlciBzcGVjaWZpZWQgcm9sZShzKSwgcmF0aGVyIHRoYW4gbmF0aXZlIGNvbnRhaW5lcnNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQsIHRoZSAnYXJpYV9yb2xlX3JlZHVuZGFudCcgcnVsZSBzaG91bGQgYmUgdHJpZ2dlcmVkIGFuZCBhZGRyZXNzZWQgZmlyc3QsXG4gICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBydWxlIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFsaXN0JyAmJiByb2xlcyAmJiByb2xlcy5pbmNsdWRlcyhcImxpc3Rib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbal1dO1xuICAgICAgICAgICAgaWYgKHJvbGVDb250YWluZXJzLmluZGV4T2Yocm9sZXNbal0pID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIGtleWJvYXJkIGV2ZW50IGhhbmRsZXIgb24gdGhlIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8ga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBmb3VuZCBvbiBwYXJlbnQuIFNlZSBpZiBrZXlib2FyZCBldmVudCBoYW5kbGVycyBhcmUgb24gcmVxdWlyZWQgY2hpbGQgZWxlbWVudHMuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHsgLyogU01GIFRPRE8gbWVudWJhciBkb2VzIG5vdCBoYXZlIGFueSByZXFDaGlsZHJlbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aCA9IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSA8IHJlcXVpcmVkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCIqW2NvbnRhaW5zKEByb2xlLCdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInKV1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKHIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGlsZCBkaWQgbm90IGhhdmUgYSBrZXkgaGFuZGxlci4gU2VlIGlmIGFueSBvZiB0aGUgZ3JhbmRjaGlsZHJlbiBkby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFcIiAmJiByMi5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpb24gbGluayBtdXN0IHN0YXJ0IHdpdGggXCJqYXZhc2NyaXB0OlwiLCBtdXN0IG5vdCBjb250YWluIGEgXCJ2b2lkXCIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgcmVxdWlyZWQgY2hpbGRyZW4gKG9yIGFueSBkZXNjZW5kYW50cyBvZiB0aGUgcmVxdWlyZWQgY2hpbGRyZW4pIG11c3QgaGF2ZSBrZXlwcmVzcy9rZXlkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgaXQgaXMgYSBmYWlsdXJlLCBubyBuZWVkIHRvIGtlZXAgY2hlY2tpbmcgYW55IG1vcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBmYWlsZWQgdGhlIGtleWRvd24va2V5cHJlc3MsIGFuZCBpdCBkb2VzIG5vdCBoYXZlIHJlcXVpcmVkIGNoaWxkcmVuLCBzdWNoIGFzIG1lbnViYXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIGNoZWNrIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocjIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocjIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocjIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCByMi5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSByMi5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgZnVuY3Rpb24gbmFtZSBmb2xsb3dpbmcgXCJqYXZhc2NyaXB0OlwiIChpLmUuLCBocmVmLmxlbmd0aCA+IDExKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCAmJiBzYXZlZFBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHNhdmVkUGFzc2VkID0gcGFzc2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIGxlYXZlIGl0IHRvIHRoZSBjb21ib2JveCBydWxlcyB0byBjaGVja1xuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHM9JyR7aWR9J11bcm9sZT0nY29tYm9ib3gnXWApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhdmVkUGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbXBsZW1lbnRhcnksIGFyaWE6YmFubmVyLCBhcmlhOmNvbnRlbnRpbmZvLCBhcmlhOm1haW4sIGFyaWE6bmF2aWdhdGlvbiwgYXJpYTpyZWdpb24sIGFyaWE6c2VhcmNoLCBhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImxhbmRtYXJrX25hbWVfdW5pcXVlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcIkZhaWxfMFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJ7MH1cXFwiIGxhbmRtYXJrcyB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IHJlZ2lvbiBhcmUgZGlzdGluZ3Vpc2hlZCBieSB1bmlxdWUgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInswfVxcXCIgbGFuZG1hcmtzIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgcmVnaW9uIGFyZSBub3QgZGlzdGluZ3Vpc2hlZCBmcm9tIG9uZSBhbm90aGVyIGJlY2F1c2UgdGhleSBoYXZlIHRoZSBzYW1lIFxcXCJ7MX1cXFwiIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBsYW5kbWFyayBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnYXJpYS1sYWJlbGxlZGJ5JyBvciAnYXJpYS1sYWJlbCcgb3IgYmUgbmVzdGVkIGluIGEgZGlmZmVyZW50IHBhcmVudCByZWdpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLCAvL3JlbWFwcGVkIHRvIDIuNC4xIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBhbGwgbGFuZG1hcmsgcmVnaW9uIHJ1bGVzXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVE9ETyBkbyBJIG5lZWQgdG8gZml0ZXIgb3V0IGJhZCBjb250ZW50aW5mbyBub2RlczogVGhlIGZvb3RlciBlbGVtZW50IGlzIG5vdCBhIGNvbnRlbnRpbmZvIGxhbmRtYXJrIHdoZW4gaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBmb2xsb3dpbmcgSFRNTDUgc2VjdGlvbmluZyBlbGVtZW50czogaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL2xhbmRtYXJrcy9IVE1MNS5odG1sXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhpcyBsYW5kbWFyayBpcyBpbnNpZGUgYSBkaWFsb2cgZWxlbWVudC4gSWYgaXQgaXMgd2UgYXJlIGdvaW5nIHRvIHNraXAgY2hlY2tpbmcgaXQuIFxuICAgICAgICB2YXIgY29weU9mUnVsZUNvbnRleHQgPSBydWxlQ29udGV4dDtcbiAgICAgICAgdmFyIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dCA9IFtdO1xuICAgICAgICB3aGlsZSAoY29weU9mUnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC51bnNoaWZ0KGNvcHlPZlJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGNvcHlPZlJ1bGVDb250ZXh0ID0gY29weU9mUnVsZUNvbnRleHQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZSA9PSBcIkRJQUxPR1wiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAvLyBTa2lwcGluZyBjaGVja2luZyBsYW5kbWFya3MgdGhhdCBoYXBwZW4gdG8gYmUgaW5zaWRlIGRpYWxvZyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvLyBCZWdpbmluZyBmb3JtQ2FjaGUgd29ya1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA6IHtcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogYW55W10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsczogc3RyaW5nW10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IHN0cmluZ1tdXG4gICAgICAgIH0gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLUVOVEVSSU5HIEZPUk0gQ0FDSEVcIilcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNUZW1wID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICdhc2lkZSxbcm9sZT1cImNvbXBsZW1lbnRhcnlcIl0sIGZvb3Rlcixbcm9sZT1cImNvbnRlbnRpbmZvXCJdLCBoZWFkZXIsW3JvbGU9XCJiYW5uZXJcIl0sIG1haW4sW3JvbGU9XCJtYWluXCJdLCBuYXYsW3JvbGU9XCJuYXZpZ2F0aW9uXCJdLCBmb3JtLFtyb2xlPVwiZm9ybVwiXSwgc2VjdGlvbixbcm9sZT1cInJlZ2lvblwiXSxbcm9sZT1cInNlYXJjaFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzID0gQXJyYXkuZnJvbShuYXZpZ2F0aW9uTm9kZXNUZW1wKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzID0gW107XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgb2YgY29kZSBmaWx0ZXJzIG91dCBhbnkgbmF2IGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIGEgZGlhbG9nLiBBcyB0aG9zZSBhcmUgbm90IG9uZXMgd2Ugd2FudCB0byB0ZXN0IGFnYWluc3QgYXMgd2UgY29uc2lkZXIgZGlhbG9ncyBhcmUgc2VwYXJhdGUgbG9jYXRpb25zIGZyb20gdGhlIHJlc3Qgb2YgdGhlIG1haW4gcGFnZS5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgYS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkaWFsb2dOb2RlRm91bmRGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzLnB1c2gobmF2aWdhdGlvbk5vZGVzW2ldKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlcyA9IG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzO1xuXG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbGFuZG1hcmsgbm9kZXNcbiAgICAgICAgICAgICAgICBsZXQgZWxzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGEgPSBuYXZpZ2F0aW9uTm9kZXNbaV0ucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoYSkge1xuICAgICAgICAgICAgICAgICAgICBlbHMucHVzaChhKTtcbiAgICAgICAgICAgICAgICAgICAgYSA9IGEucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBwYXJlbnRzIG9mIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIG5lYXJlc3QgbGFuZG1hcmsgcGFyZW50IGJhc2VkIG9uIHRoZSB0YWdOYW1lIG9yIHRoZSByb2xlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnTmFtZVRyaWdnZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkFTSURFXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZPT1RFUlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJGT1JNXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkhFQURFUlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJNQUlOXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk5BVlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTRUNUSU9OXCIsXG4gICAgICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMoZWxzW2pdLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZU5hbWVUcmlnZ2VyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbHNbal0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVUcmlnZ2VyID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29tcGxlbWVudGFyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29udGVudGluZm9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZvcm1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJhbm5lclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmF2aWdhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmVnaW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMoZWxzW2pdLmdldEF0dHJpYnV0ZShcInJvbGVcIikpOyAvLyBUT0RPIHdlIGFyZSBub3QgY292ZXJpbmcgdGhlIGNhc2Ugd2hlcmUgYSBlbGVtZW5lbnQgd2l0aCBtdWx0aXBsZSByb2xlcy4gZS5nLiwgcm9sZSA9IFwiZm9ybSBiYW5uZXJcIi4gVGhpcyBpcyBhIGltcHJvdm1lbnQgd2UgbWlnaHQgd2FudCB0byBhZGQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnTmFtZVRyaWdnZXIgfHwgcm9sZU5hbWVUcmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWFyZXN0IHBhcmVudC1sYW5kbWFyayBmb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5wdXNoKGVsc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gZWxzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBpcyBhdCB0aGUgaGVhZCBvZiB0aGUgZmlsZSBzbyBpdCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobmF2aWdhdGlvbk5vZGVzW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC8qKkFSSUFNYXBwZXIuY29tcHV0ZU5hbWUobmF2aWdhdGlvbk5vZGVzW2ldKSovXG4gICAgICAgICAgICAgICAgICAgIHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCA/IHBhaXIubmFtZS50cmltKCkgOiBcIlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIHBhcmVudHMgb2YgdGhlIGxhbmRtYXJrIG5vZGVzIHRvIGZpbmQgZHVwbGljYXRlc1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IHBhc3NfMF9mbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBjb21wYXJlIGFnYWluc3Qgb3Vyc2VsZnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgZm9jdXMgb24gdGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmVudCBsYW5kbWFyayBpcyBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0gPT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbal0gPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbG9va2luZyBhdCB0d28gcm9vdCBub2Rlcywgc28gd2Ugc2hvdWxkIGNvbXBhcmUgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUobmF2aWdhdGlvbk5vZGVzW2ldKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUobmF2aWdhdGlvbk5vZGVzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBoYXZlIHRoZSBzYW1lIHJvbGUgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbal1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBoYXZlIHRoZSBzYW1lIChjb21wdXRlZCkgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIkZhaWxfMFwiKTsgLy8gRmFpbCAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyAmJiBzYW1lIG5vZGUgcm9sZXMgQlVUIGRpZmZlcmVudCBjb21wdXRlZCBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGF0IGxlYXN0IGEgUGFzc18wLiBCdXQgd2UgbmVlZCB0byBjaGVjayBhbGwgbm9kZXMgdG8gc2VlIGlmIGFub3RoZXIgb25lIGZhaWxzLiBTbyBzZXQgYSBmbGFnLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzXzBfZmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgYnV0IGRpZmZlcmVudCBub2RlIHJvbGVzIC8vIE5vdCBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGxvb2tpbmcgYXQgYSBzaW5nbGUgcm9vdCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGZvY3VzIG9uIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXJlbnQgbGFuZG1hcmsgaXMgTk9UIG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbC5zYW1lTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbal1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRoZSBzYW1lIHBhcmVudC1sYW5kbWFyayBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUobmF2aWdhdGlvbk5vZGVzW2ldKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUobmF2aWdhdGlvbk5vZGVzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBoYXZlIHRoZSBzYW1lIHJvbGUgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbal1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBoYXZlIHRoZSBzYW1lIChjb21wdXRlZCkgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIkZhaWxfMFwiKTsgLy8gRmFpbCAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyAmJiBzYW1lIG5vZGUgcm9sZXMgQlVUIGRpZmZlcmVudCBjb21wdXRlZCBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGF0IGxlYXN0IGEgUGFzc18wLiBCdXQgd2UgbmVlZCB0byBjaGVjayBhbGwgbm9kZXMgdG8gc2VlIGlmIGFub3RoZXIgb25lIGZhaWxzLiBTbyBzZXQgYSBmbGFnLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzXzBfZmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgYnV0IGRpZmZlcmVudCBub2RlIHJvbGVzIC8vIE5vdCBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbnQgcGFyZW50cyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc18wX2ZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIm51bGxcIik7IC8vIFRoaXMgaXMgbm90IHRoZSBrZXl3b3JkIG51bGwgb24gcHVycG9zZS4gSXQgaXMgYSBzcGFjZWhvbGRlciBpbiB0aGUgYXJyYXkgc28gaW5kZXhlcyBtYXRjaCB1cC5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQgPSBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZm9ybUNhY2hlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUT0RPIEFkZCB2YWxpZGF0aW9uIHRoYXQgYWxsIDMgYXJyYXlzIGFyZSB0aGUgc2FtZSBsZW5ndGhcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLUVuZCBmb3JtQ2FjaGVcIilcbiAgICAgICAgfSAvLyBFbmQgZm9ybUNhY2hlXG5cbiAgICAgICAgbGV0IGluZGV4VG9DaGVjayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pc1NhbWVOb2RlKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0NoZWNrID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhUb0NoZWNrID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwiUGFzc18wXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpbmRleFRvQ2hlY2tdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZFtpbmRleFRvQ2hlY2tdID09PSBcIkZhaWxfMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzBcIixcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaW5kZXhUb0NoZWNrXVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaW5kZXhUb0NoZWNrXSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9tYWluX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm1haW5cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTWFpbnNSZXF1aXJlTGFiZWxfSW1wbGljaXRfMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGUgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgbGV0IHBhcmVudERvY1JvbGUgPSBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCBtYWlucyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWlucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1haW5zW2ldID09PSBydWxlQ29udGV4dCkgY29udGludWU7XG4gICAgICAgICAgICByZXN1bHQgPSBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIGxldCB0aGlzUGFyZW50RG9jUm9sZSA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICAgICAgbWFpbnNbaV0sXG4gICAgICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpc1BhcmVudERvY1JvbGUgPT09IHBhcmVudERvY1JvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKG1haW5zW2ldKSA9PT0gY29udGV4dExhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9tYWluX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU1haW5zVmlzaWJsZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSB2aXNpYmxlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdW5pcXVlIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvL2NhbGwgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4gd2l0aCBjb25zaWRlckltcGxpY2l0IGZsYWcgYXMgdHJ1ZVxuICAgICAgICAvL3NvIHRoYXQgdGhlIG1ldGhvZCByZXR1cnMgPG1haW4+IGVsZW1lbnRzXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzVW5pcXVlQXJpYUxhYmVsbGVkYnkobGFuZG1hcmtzKTtcblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm5hdmlnYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTmF2aWdhdGlvbkxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm5hdmlnYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IEFyaWFVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3BhcmVudF9yZXF1aXJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3BhcmVudF9yZXF1aXJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IHJvbGUgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBpcyBub3QgY29udGFpbmVkIGluIG9yIG93bmVkIGJ5IGFuIGVsZW1lbnQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyByb2xlczogXFxcInsxfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IENoZWNrIEZhaWwgM1xuICAgIGFjdDogXCJmZjg5YzlcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGNvbnRhaW5lclJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRDb250YWluZXIgPSAwO1xuXG4gICAgICAgIGxldCBhbmNlc3RvclJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICBsZXQgcGFyZW50Um9sZSA9IGFuY2VzdG9yUm9sZXNbYW5jZXN0b3JSb2xlcy5sZW5ndGggLSAyXTtcbiAgICAgICAgbGV0IGNvdW50ID0gMjtcbiAgICAgICAgd2hpbGUgKHBhcmVudFJvbGUgPT09ICdub25lJykge1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgIHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gY291bnRdO1xuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKmZvciAobGV0IGogPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJSb2xlcyA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5jb250YWluZXI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlID09PSBjb250YWluZXJSb2xlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICAqL1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVdICYmIGRlc2lnblBhdHRlcm5zW3JvbGVdLmNvbnRhaW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGFpbmVyUm9sZXMgPSBkZXNpZ25QYXR0ZXJuc1tyb2xlXS5jb250YWluZXI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgY29udGFpbmVyc0xlbmd0aCA9IGNvbnRhaW5lclJvbGVzLmxlbmd0aDsgIXBhc3NlZCAmJiBpIDwgY29udGFpbmVyc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZSA9PT0gY29udGFpbmVyUm9sZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFzc2VkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChjb250YWluZXJSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAodGVzdGVkQ29udGFpbmVyID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnJlZ2lvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVSZWdpb25zVW5pcXVlTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICAvLyBmb3JtIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBpZiBpdCBoYXMgYW4gYXJpYSBsYWJlbCBvciB0aXRsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcInJlZ2lvblwiIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8XG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkgfHxcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGR1cGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgICAgIGR1cGVzID0gQXJpYVV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbXlMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmXG4gICAgICAgICAgICAgICAgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yZWdpb25fbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6cmVnaW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZWdpb25MYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICAgICAgLy8gXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8yXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIGxhYmVsXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGlzIG5vdCBsYWJlbGVkIHdpdGggJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcm9sZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRSb2xlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYXJpYV9yb2xlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgbXVzdCBoYXZlIGEgdmFsaWQgJ3JvbGUnIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIHJvbGUgJ3swfScgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBpcyBub3QgdmFsaWQgcGVyIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlNvbWUgb2YgdGhlIHJvbGVzLCAnezB9JywgZGVmaW5lZCBvbiB0aGUgZWxlbWVudCBhcmUgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogUmVjaGVja1xuICAgIGFjdDogXCI2NzRiMTBcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcm9sZVN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChyb2xlU3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpbnZhbGlkUm9sZXMgfHwgaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcm9sZXMgPSByb2xlU3RyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA9PT0gcm9sZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIixcIildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9yb2xlX3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcIlRoZSBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBcXFwiezB9XFxcIiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkFSSUFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBhcmlhUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICBpZiAoIWFyaWFSb2xlcyB8fCBhcmlhUm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIGxldCByb2xlX2RlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQoYXJpYVJvbGVzKTtcbiAgICAgICAgaWYgKCFyb2xlX2RlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkIGluIHRoZSBwYXJlbnQgcmVsYXRpb24sIHRoZW4gc2tpcCB0aGlzIGNoZWNrXG4gICAgICAgIGlmIChbXCJ0ZFwiLCBcInRoXCIsIFwidHJcIl0uaW5jbHVkZXMoZWxlbU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IFRhYmxlVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMgfHwgaW1wbGljaXRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMuaW5jbHVkZXMoYXJpYVJvbGVzW2ldKSkgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICBlbHNlICAgICBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhUm9sZXNbaV0sIGVsZW1OYW1lXSkpO1xuICAgICAgICB9ICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpzZWFyY2hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlU2VhcmNoTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwic2VhcmNoXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IEFyaWFVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvLyByZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yb2xlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfc2VtYW50aWNzX3JvbGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIEFSSUEgcm9sZSAnezB9JyBpcyBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSBBUklBIHJvbGUgJ3swfScgaXMgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PiBhbmQgbWF5IGJlIGlnbm9yZWQgYnkgdGhlIGJyb3dzZXIgc2luY2UgdGhlIGVsZW1lbnQgaXMgZm9jdXNhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSByb2xlcyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCB0byB3aGljaCB0aGV5IGFyZSBhc3NpZ25lZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIG9ubHkgY2hlayBlbGVtZW50ICgxKSBhbmQgZnJhZ21lbnQgbm9kZXMgKDExKVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IGFyaWFfcm9sZV9hbGxvd2VkLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAgICAgY29uc3QgdW5kZWZpbmVkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICh1bmRlZmluZWRSb2xlcyAmJiB1bmRlZmluZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlcyAmJiBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkLCB0aGVuIHNraXBcbiAgICAgICAgaWYgKFtcInRkXCIsIFwidGhcIiwgXCJ0clwiXS5pbmNsdWRlcyh0YWdOYW1lKSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBDb21tb25VdGlsLmlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgICAgICBpZiAocGFyZW50Um9sZSAhPT0gbnVsbCAmJiBwYXJlbnRSb2xlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG9tUm9sZXM6IHN0cmluZ1tdID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBjaGVjayB0aGUgJ2dlbmVyaWMnIHJvbGUgZmlyc3RcbiAgICAgICAgaWYgKGRvbVJvbGVzLmluY2x1ZGVzKCdnZW5lcmljJykpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW1wiZ2VuZXJpY1wiLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gQXJpYVV0aWwuZ2V0SW52YWxpZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcyA9PT0gbnVsbCB8fCBpbnZhbGlkUm9sZXMubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW2RvbVJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuXG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMuaW5jbHVkZXMoXCJwcmVzZW50YXRpb25cIikgfHwgaW52YWxpZFJvbGVzLmluY2x1ZGVzKFwibm9uZVwiKSAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2ludmFsaWRSb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChkb21Sb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtkb21Sb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLy8gVGhpcyBydWxlIGlzIGluIHRoZSBzYW1lIGZpbGUgYmVjYXVzZSB0aGVyZSBpcyBhIGRlcGVuZGVuY3kgdGhhdCBhcmlhX3JvbGVfdmFsaWQgcnVucyBmaXJzdCxcbi8vIGFuZCB0aGUgaW5mbyBpcyBwYXNzZWQgYnkgY2FjaGUsIGJ1dCB0aGVyZSBpc24ndCBhIGRlcGVuZGVuY3kgaW4gdGhlIEZhaWxfMiBzY2VuYXJpbywgc28gcmVndWxhclxuLy8gZGVwZW5kZW5jeSBjYW5ub3QgYmUgdXNlZFxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIC8vIFRoZSB0aGUgQVJJQSByb2xlIGlzIGNvbXBsZXRlbHkgaW52YWxpZCwgc2tpcCB0aGlzIGNoZWNrXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsIFwiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJQYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBhdHRyaWJ1dGVzIHNob3VsZCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgYW5kIEFSSUEgcm9sZSB0byB3aGljaCB0aGV5IGFyZSBhc3NpZ25lZFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiQVJJQSBhdHRyaWJ1dGVzIGFyZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgYW5kIEFSSUEgcm9sZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PiB3aXRoIEFSSUEgcm9sZSBcXFwiezJ9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlcyBcXFwiezB9XFxcIiBhcmUgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PiB3aXRoIGltcGxpY2l0IEFSSUEgcm9sZSBcXFwiezJ9XFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSwgLy9yZW1vdmVkIG1hcHBpbmcgdG8gNC4xLjIgZnJvbSBoZXJlIGFuZCBoZWxwXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiNWMwMWVhXCIsIHsgXCI0NmNhN2ZcIjogeyBcIlBhc3NcIjogXCJwYXNzXCIsIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcImZhaWxcIiwgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiZmFpbFwifX1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIG9ubHkgY2hlayBlbGVtZW50ICgxKVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgbm8gYXJpYSBhdHRyaWJ1dGVcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzOnN0cmluZ1tdID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChhcmlhQXR0cmlidXRlcyA9PT0gbnVsbCB8fCBhcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBcbiAgICAgICAgbGV0IHJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZXhwbGljaXQgPSB0cnVlO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgICAgICBpZiAoIUFyaWFVdGlsLmFyZVJvbGVzRGVmaW5lZChyb2xlcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL25vIGV4cGxpY2l0IHJvbGUgZGVmaW5lZFxuICAgICAgICAgICAgcm9sZXMgPSAgQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGV4cGxpY2l0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgZmFpbGVkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghZmFpbGVkQXR0cmlidXRlcyB8fCBmYWlsZWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIiwgW2FyaWFBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG5cbiAgICAgICAgaWYgKHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChleHBsaWNpdClcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiLCBbZmFpbGVkQXR0cmlidXRlcy5qb2luKFwiLCBcIiksIHRhZ05hbWUsIHJvbGVzLmpvaW4oXCIsIFwiKV0pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgXCJub25lXCJdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dG9vbGJhclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVUb29sYmFyVW5pcXVlTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInRvb2xiYXJcXFwiIHJvbGVzIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwidG9vbGJhclxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLCAvL3VwZGF0ZWQgbWFwcGluZyB0byBtYXRjaCBvdGhlciBsYW5kbWFyayByZWdpb25zIHJ1bGVzXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vIEFsc28sIGNvbnNpZGVyIEltcGxpY2l0IHJvbGUgY2hlY2tpbmcuXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwidG9vbGJhclwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gQXJpYVV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbXlMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3dpZGdldF9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3dpZGdldF9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1dpZGdldExhYmVsc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW50ZXJhY3RpdmUgY29tcG9uZW50IG11c3QgaGF2ZSBhIHByb2dyYW1tYXRpY2FsbHkgYXNzb2NpYXRlZCBuYW1lXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkludGVyYWN0aXZlIGNvbXBvbmVudCB3aXRoIEFSSUEgcm9sZSAnezB9JyBkb2VzIG5vdCBoYXZlIGEgcHJvZ3JhbW1hdGljYWxseSBhc3NvY2lhdGVkIG5hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwibTZiMXEzXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gYW5kIHJvbGU9bm9uZSBzaW5jZSB0aGVzZSAyIHJvbGVzIGFyZSBub3QgaW4gdGhlIGxpc3Qgb2Ygd2lkZ2V0IHR5cGUgcm9sZXMgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiZcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImhpZGRlblwiKSB8fFxuICAgICAgICAgICAgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikgJiZcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGRpYWdub3NlIHRoYXQgYSBjb21ib2JveCBpbnB1dCB0ZXh0Ym94IGhhcyBhIGxhYmVsKGdpdGh1YiBpc3N1ZSAjMTEwNClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW1Sb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEhhbmRsZWQgYnkgaW5wdXRfbGFiZWxfZXhpc3RzXG4gICAgICAgIGxldCBza2lwUm9sZXMgPSBbXG4gICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgXCJjb21ib2JveFwiLFxuICAgICAgICAgICAgXCJsaXN0Ym94XCIsXG4gICAgICAgICAgICBcIm1lbnVpdGVtY2hlY2tib3hcIixcbiAgICAgICAgICAgIFwibWVudWl0ZW1yYWRpb1wiLFxuICAgICAgICAgICAgXCJyYWRpb1wiLFxuICAgICAgICAgICAgXCJzZWFyY2hib3hcIixcbiAgICAgICAgICAgIFwic2xpZGVyXCIsXG4gICAgICAgICAgICBcInNwaW5idXR0b25cIixcbiAgICAgICAgICAgIFwic3dpdGNoXCIsXG4gICAgICAgICAgICBcInRleHRib3hcIixcbiAgICAgICAgICAgIFwicHJvZ3Jlc3NiYXJcIixcbiAgICAgICAgICAgIFwibGlua1wiLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc2tpcFJvbGVzLmluY2x1ZGVzKGVsZW1Sb2xlKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRhZ05hbWUgPT09IFwib3V0cHV0XCIgfHxcbiAgICAgICAgICAgICh0YWdOYW1lID09PSBcImlucHV0XCIgJiZcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImZpbGVcIilcbiAgICAgICAgKSB7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAvLyBGb3JtL2lucHV0IGVsZW1lbnRzIGFyZSBjaGVja2VkIGJ5IEc0MSwgd2Ugc2tpcCB0aGVtIGZyb20gdGhpcyBydWxlLiBHaXRodWIgaXNzdWUgNDQ5XG4gICAgICAgICAgICBsZXQgc2tpcEVsZW1lbnRzID0gW1xuICAgICAgICAgICAgICAgIFwiaW5wdXRcIixcbiAgICAgICAgICAgICAgICBcInRleHRhcmVhXCIsXG4gICAgICAgICAgICAgICAgXCJzZWxlY3RcIixcbiAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxuICAgICAgICAgICAgICAgIFwiZGF0YWxpc3RcIixcbiAgICAgICAgICAgICAgICBcIm9wdGdyb3VwXCIsXG4gICAgICAgICAgICAgICAgXCJvcHRpb25cIixcbiAgICAgICAgICAgICAgICBcImtleWdlblwiLFxuICAgICAgICAgICAgICAgIFwib3V0cHV0XCIsXG4gICAgICAgICAgICAgICAgXCJwcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIFwibWV0ZXJcIixcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc2tpcEVsZW1lbnRzLmluZGV4T2YocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT1cbiAgICAgICAgICAgICAgICAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIHRoZSBwb3B1cCBsaXN0IG9mIGEgY29tYm9ib3guXG4gICAgICAgIGxldCByb2xlc1RvQ2hlY2sgPSBbXCJsaXN0Ym94XCIsIFwidHJlZVwiLCBcImdyaWRcIiwgXCJkaWFsb2dcIl07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXNUb0NoZWNrLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCByb2xlc1RvQ2hlY2tbal0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ZXMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBcImNvbWJvYm94XCIsXG4gICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29tYm9ib3hlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3ggPSBjb21ib2JveGVzW2tdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYV9vd25zID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tYm9ib3gsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFyaWEtb3duc1wiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmlhX293bnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25zID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFfb3ducy50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgICkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25zW2ldXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWQgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgcHJvaGliaXRlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vZ2V0IGF0dHJpYnV0ZSByb2xlcyBhcyB3ZWxsIGFzIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGxldCBudW1XaWRnZXRzVGVzdGVkID0gMDtcbiAgICAgICAgbGV0IGludGVyYWN0aXZlUm9sZVR5cGVzID0gW1wid2lkZ2V0XCIsIFwibGl2ZVJlZ2lvblwiLCBcIndpbmRvd1wiXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJvbGVzLmxlbmd0aDsgcGFzc2VkICYmIGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXR0ZXJuICYmXG4gICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lUmVxdWlyZWQgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLnJvbGVUeXBlICYmXG4gICAgICAgICAgICAgICAgaW50ZXJhY3RpdmVSb2xlVHlwZXMuaW5jbHVkZXMocGF0dGVybi5yb2xlVHlwZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICsrbnVtV2lkZ2V0c1Rlc3RlZDtcblxuICAgICAgICAgICAgICAgIC8vIEFsbCB3aWRnZXRzIG1heSBoYXZlIGFuIGF1dGhvciBzdXBwbGllZCBhY2Nlc3NpYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgLy8gVGl0bGUgaXMgbGVnYWwsIGJ1dCBkb24ndCBhZHZlcnRpc2UgaXRzIHVzZSBpbiBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgICAgICAgIC8vIEVuY291cmFnZSB1c2Ugb2YgYXJpYS1sYWJlbCwgYXJpYS1sYWJlbGxlZGJ5IG9yIGh0bWwgbGFiZWwgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPVxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8XG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhcGFzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ubmFtZUZyb20gJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lRnJvbS5pbmRleE9mKFwiY29udGVudHNcIikgPj0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaWYgd2lkZ2V0J3MgYWNjZXNzaWJsZSBuYW1lIGlzIHN1cHBsaWVkIGJ5IGVsZW1lbnQncyBpbm5lciB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC8vIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudE9yQWx0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBoYXMgaW1wbGljaXQgbGFiZWwsIGxpa2UgPGxhYmVsPjxpbnB1dCAuLi4uPmFiYyA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXBhc3NlZCAmJlxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW1nXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBET01VdGlsLmNsZWFuV2hpdGVzcGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ubmFtZUZyb20uaW5kZXhPZihcInByb2hpYml0ZWRcIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9oaWJpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobnVtV2lkZ2V0c1Rlc3RlZCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtlbGVtUm9sZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZCkge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXNjaWlhcnRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhc2NpaWFydF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206cHJlLCBkb206bGlzdGluZywgZG9tOnhtcCwgZG9tOnBsYWludGV4dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1ByZV9BU0NJSUFydFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBBU0NJSSBhcnQgaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFTQ0lJIGFydCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogRGVjaXNpb24gaW4gcGxhbm5pbmcgOS83LzIzIHRoYXQgdGhpcyBydWxlIGNhdXNlcyBtb3JlIHJldmlld3MgdGhhdCB3ZSBzZWUgYWN0dWFsIHByb2JsZW1zIGluIGNvbnRlbnQsIHNvIHR1cm4gdGhlc2UgcnVsZXMgb2ZmXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgKi9cbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIEZpeCBmb3IgSURXQiB3cml0ZXJzLiBEb24ndCB0cmlnZ2VyIGlmIGNvbnRlbnQgaXMgaW4gYSBjb2RlIGVsZW1lbnQuICBUaGUgY29kZSBlbGVtZW50IGlzIHNlYXJjaGVkIGZvclxuICAgICAgICAvLyBpbiB2YXJpb3VzIHBsYWNlcyBiZWNhdXNlIG9mIHRoZSB3ZWlyZCB3YXkgdmFyaW91cyBicm93c2VycyByZW5kZXIgPGNvZGU+PHByZT48L3ByZT48L2NvZGUuICBGaXJlZm94LFxuICAgICAgICAvLyBIdG1sVW5pdCBhbmQgQ2hyb21lIGFsbCByZW5kZXIgZGlmZmVyZW50bHkuICBGaXJlZm94OiA8Y29kZT48L2NvZGU+PHByZT48L3ByZT4gIEh0bWxVbml0OiA8L2NvZGU+PHByZT48Y29kZT48L2NvZGU+PC9wcmU+XG4gICAgICAgIC8vIFNlZSB1bml0IHRlc3QgQ29kZUVsZW1lbnRBYm92ZVByZUVsZW1lbnQuaHRtbC4gIERvbid0IGtub3cgaG93IFJQVCByZW5kZXJzLCBzbyBjb3ZlciBhbGwgdGhlIGJhc2VzLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInByZVwiKSB7XG4gICAgICAgICAgICBpZiAoKHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZyAmJiBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImNvZGVcIikgfHxcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvZGVcIikubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiY29kZVwiKSkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eHRWYWx1ZSA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgIGxldCBsYXN0Q2hhcmFjdGVyID0gXCJcIjtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRleHQgY29udGVudFxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBwYXNzZWQgJiYgKGlkeCA8IHR4dFZhbHVlLmxlbmd0aCk7ICsraWR4KSB7XG4gICAgICAgICAgICBsZXQgY2hTdHIgPSB0eHRWYWx1ZS5zdWJzdHIoaWR4LCAxKTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGFscGhhbnVtZXJpYyBvciBwdW5jdHVhdGlvblxuICAgICAgICAgICAgaWYgKC9bXFx3IUAjJCUmXFwqKCkuLD9cXFtcXF17fTw+PVwiOlxcL1xcXFwtXS8udGVzdChjaFN0cikpIHtcbiAgICAgICAgICAgICAgICAvLyBEZXRlY3Qgc2FtZSBjaGFyYWN0ZXIgc2VxdWVuY2VcbiAgICAgICAgICAgICAgICBpZiAobGFzdENoYXJhY3RlciA9PSBjaFN0cikge1xuICAgICAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCArIDE7O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xccy8udGVzdChjaFN0cikpIHtcbiAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA9IG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgKyAxO1xuICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdENoYXJhY3RlciA9IGNoU3RyO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBkZWNpc2lvblxuICAgICAgICAgICAgaWYgKG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPj0gNSB8fCBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID49IDQpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGJsaW5rX2Nzc19yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYmxpbmtfY3NzX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbGlua19DU1NUcmlnZ2VyMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGJsaW5rX2Nzc19yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGJsaW5rX2Nzc19yZXZpZXcuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRG8gbm90IHVzZSB0aGUgXFxcImJsaW5rXFxcIiB2YWx1ZSBvZiB0aGUgJ3RleHQtZGVjb3JhdGlvbicgcHJvcGVydHkgZm9yIGxvbmdlciB0aGFuIGZpdmUgc2Vjb25kc1wiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIHRoZSBcXFwiYmxpbmtcXFwiIHZhbHVlIG9mIHRoZSBDU1MgJ3RleHQtZGVjb3JhdGlvbicgcHJvcGVydHkgaXMgbm90IHVzZWQgZm9yIG1vcmUgdGhhbiB0aGFuIGZpdmUgc2Vjb25kc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMi4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0ZXh0VmFsdWUgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoJ3N0eWxlJykpIHtcbiAgICAgICAgICAgIHRleHRWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0ZXh0VmFsdWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwidGV4dC1kZWNvcmF0aW9uOmJsaW5rXCIpID09IC0xO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBibGlua19lbGVtX2RlcHJlY2F0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYmxpbmtfZWxlbV9kZXByZWNhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206YmxpbmtcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9CbGlua19BbHdheXNUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGJsaW5rX2VsZW1fZGVwcmVjYXRlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBibGlua19lbGVtX2RlcHJlY2F0ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29udGVudCB0aGF0IGJsaW5rcyBwZXJzaXN0ZW50bHkgbXVzdCBub3QgYmUgdXNlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDb250ZW50IGZvdW5kIHRoYXQgYmxpbmtzIHBlcnNpc3RlbnRseVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjIuMi4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYmxvY2txdW90ZV9jaXRlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJibG9ja3F1b3RlX2NpdGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YmxvY2txdW90ZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0Jsb2NrcXVvdGVfSGFzQ2l0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJibG9ja3F1b3RlX2NpdGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJibG9ja3F1b3RlX2NpdGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJibG9ja3F1b3RlX2NpdGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCA8YmxvY2txdW90ZT4gc2hvdWxkIGhhdmUgYSAnY2l0ZScgYXR0cmlidXRlIGFuZCBub3QgYmUgdXNlZCBmb3IgaW5kZW50YXRpb24gb25seVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZSA8YmxvY2txdW90ZT4gb25seSBmb3IgcXVvdGF0aW9ucywgbm90IGluZGVudGF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImNpdGVcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgY2l0ZUVsZW1zID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImNpdGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBjaXRlRWxlbXMgIT0gbnVsbCAmJiBjaXRlRWxlbXMubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjYW52YXNfY29udGVudF9kZXNjcmliZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Y2FudmFzXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0NhbnZhc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgYWNjZXNzaWJpbGl0eSBvZiB0aGUgPGNhbnZhcz4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8Y2FudmFzPiBlbGVtZW50IG1heSBub3QgYmUgYWNjZXNzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIyLjEuMVwiLCBcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBjYXB0aW9uX3RyYWNrX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJjYXB0aW9uX3RyYWNrX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnZpZGVvXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX1ZpZGVvX0hhc05vVHJhY2tcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgY2FwdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgYW55IG1lYW5pbmdmdWwgYXVkaW8gb3IgcHJvdmlkZSBhIGNhcHRpb24gdHJhY2sgZm9yIHRoZSA8dmlkZW8+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDx2aWRlbz4gZWxlbWVudCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlIGZvciBhbnkgbWVhbmluZ2Z1bCBhdWRpbyBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MVmlkZW9FbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaWdub3JlIGRlY29yYXRpdmUgdmlkZW8gaWYgdXNlciB1c2VzIGFyaWEtaGlkZGVuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRyYWNrcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJhY2tcIik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCB0cmFja3NbaV0uZ2V0QXR0cmlidXRlKFwia2luZFwiKSA9PT0gJ2NhcHRpb25zJztcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVja3MgZm9yIGFkZGl0aW9uIG9mIGR5bmFtaWMgdHJhY2tzXG4gICAgICAgIGlmIChydWxlQ29udGV4dC50ZXh0VHJhY2tzICYmIHJ1bGVDb250ZXh0LnRleHRUcmFja3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlQ29udGV4dC50ZXh0VHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8IHJ1bGVDb250ZXh0LnRleHRUcmFja3NbaV0ua2luZCA9PT0gJ2NhcHRpb25zJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbWlzc2luZ1wiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfaW5fcG9wdXBcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX3JvbGVfaW52YWxpZFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIidhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGlzIHVzZWQgYXBwcm9wcmlhdGVseSBmb3IgdGhpcyBjb21ib2JveFwiLFxuICAgICAgICAgICAgXCJGYWlsX21pc3NpbmdcIjogXCJUaGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIGRvZXMgbm90IGV4aXN0XCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X2luX3BvcHVwXCI6IFwiVGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiBkb2VzIG5vdCBleGlzdCB3aXRoaW4gdGhlIHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2lkJyBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgcmVmZXJlbmNlcyBhbiBlbGVtZW50IHdpdGggdGhlIHJvbGVzIFxcXCJ7MX1cXFwiLCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgQVJJQSByb2xlIG9mICdvcHRpb24nLCAnZ3JpZGNlbGwnLCAncm93Jywgb3IgJ3RyZWVpdGVtJ1wiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9ub3Rfc2VsZWN0ZWRcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgcmVmZXJlbmNlcyBhbiBlbGVtZW50IHRoYXQgZG9lcyBub3QgaGF2ZSAnYXJpYS1zZWxlY3RlZCcgc2V0IHRvIHRydWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBtdXN0IGJlIHVzZWQgdG8gZGVmaW5lIGZvY3VzIHdpdGhpbiB0aGUgY29tYm9ib3ggcG9wdXAsIGV4Y2VwdCB3aGVuIHVzaW5nIGEgZGlhbG9nIHBvcHVwXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgcG9wdXBJZCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgY29tYm9ib3ggaXMgcHJvYmFibHkgY29sbGFwc2VkLiBBIHJlZmVyZW5jZSBlcnJvciBpc1xuICAgICAgICAvLyBkZXRlY3RlZCBpbiBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcbiAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFRoaXMgcnVsZSBvbmx5IGFwcGxpZXMgaWYgdGhlIGFjdGl2ZWRlc2NlbmRhbnQgaXMgc3BlY2lmaWVkXG4gICAgICAgIGxldCBhY3RpdmVJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcbiAgICAgICAgaWYgKCFhY3RpdmVJZCB8fCBhY3RpdmVJZC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhY3RpdmVFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFjdGl2ZUlkKTtcbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX21pc3NpbmdcIiwgW2FjdGl2ZUlkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgICAgICAvLyBleGFtaW5lIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAocG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAvL2xldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWZvdW5kICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBwb3B1cEVsZW1lbnQgJiYgbncubm9kZSAhPSBwb3B1cEVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGFjdGl2ZUlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcblxuICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlUGFzcyhcIkZhaWxfbm90X2luX3BvcHVwXCIsIFthY3RpdmVJZCwgcG9wdXBJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhY3RpdmVSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGFjdGl2ZUVsZW0sIHRydWUpO1xuICAgICAgICBsZXQgdmFsaWRSb2xlcyA9IFtcIm9wdGlvblwiLCBcImdyaWRjZWxsXCIsIFwicm93XCIsIFwidHJlZWl0ZW1cIl0uZmlsdGVyKCh2YWxpZFJvbGUpID0+IGFjdGl2ZVJvbGVzLmluY2x1ZGVzKHZhbGlkUm9sZSkpO1xuICAgICAgICBpZiAodmFsaWRSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCIsIFthY3RpdmVJZCwgYWN0aXZlUm9sZXMuam9pbihcIixcIildKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aXZlRWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNlbGVjdGVkXCIpICE9PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2FjdGl2ZV9ub3Rfc2VsZWN0ZWRcIiwgW2FjdGl2ZUlkXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X2F1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJQYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsX2lubGluZVwiOiBcIkZhaWxfaW5saW5lXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJUaGUgY29tYm9ib3ggZG9lcyBub3QgdXNlICdhcmlhLWF1dG9jb21wbGV0ZScgdmFsdWUgJ1xcXCJpbmxpbmVcXFwiJyBub3IgZG9lcyBpdCBoYXZlICdhcmlhLWF1dG9jb21wbGV0ZScgZGVmaW5lZCB3aXRoaW4gdGhlIHBvcHVwXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBjb21ib2JveCBoYXMgdGhlICdhcmlhLWF1dG9jb21wbGV0ZScgYXR0cmlidXRlIGluY29ycmVjdGx5IHNldCBvbiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgcG9wdXAgcmVmZXJlbmNlZCBieSBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2lubGluZVwiOiBcIlRoZSBjb21ib2JveCBkb2VzIG5vdCBzdXBwb3J0IGFuICdhcmlhLWF1dG9jb21wbGV0ZScgYXR0cmlidXRlIHZhbHVlIHNldCB0byAnXFxcImlubGluZVxcXCInIFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgY29tYm9ib3ggdGhhdCBzdXBwb3J0cyBhdXRvY29tcGxldGlvbiBiZWhhdmlvciBtdXN0IGhhdmUgdGhlICdhcmlhLWF1dG9jb21wbGV0ZScgYXR0cmlidXRlIG9ubHkgb24gaXRzIHRleHQgaW5wdXQgZWxlbWVudCB3aXRoIGEgdmFsaWQgdmFsdWU7IGEgdmFsdWUgb2YgJ1xcXCJpbmxpbmVcXFwiJyBpcyBub3Qgc3VwcG9ydGVkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgaWYgKCFjYWNoZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBjYWNoZWRFbGVtID0gY2FjaGVbY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aF07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcG9wdXBJZCwgcG9wdXBFbGVtZW50IH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICBsZXQgcmV0VmFsID0gW107XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWF1dG9jb21wbGV0ZVwiKSA9PT0gXCJpbmxpbmVcIikge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2lubGluZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTsgXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHBvcHVwRWxlbWVudCBpdHNlbGYgaGFzIFwiYXJpYS1hdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgcGFzc2VkID0gIXBvcHVwRWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWF1dG9jb21wbGV0ZVwiKTtcbiAgICAgICAgICAgIC8vIGlmIGFueSBjaGlsZCBvZiBwb3B1cEVsZW1lbnQgaGFzIFwiYXJpYS1hdXRvY29tcGxldGVcIlxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4gJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL2xldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3BvcHVwSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZnVuY3Rpb24gcGF0dGVybkRldGVjdChlbGVtOiBFbGVtZW50KTogU3RyaW5nIHtcbiAgICAvLyBjaGVjayAnZXhwbGljaXQnIHJvbGUgY29tYm9ib3ggYW5kIHRoYXQgaXQgaXMgbm90IDxzZWxlY3Q+LiBcbiAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2VsZWN0XCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpICE9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgcmV0dXJuIFwiaW1wbGljaXRcIjtcbiAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICYmICghZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJ0ZXh0XCIpXG4gICAgICAgICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpICYmICFlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgLy8gTG9va3MgbGlrZSB0aGlzIGlzIGFuIEFSSUEgMS4wIHBhdHRlcm4sIHdoaWNoIHRoZSBBUklBIDEuMiBzcGVjIHNheXMgdG8gY29udGludWUgdG8gYWxsb3dcbiAgICAgICAgcmV0dXJuIFwiMS4wXCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiaW5wdXRcIlxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMSBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIGlzIG5vdyBpbnZhbGlkXG4gICAgICAgIHJldHVybiBcIjEuMVwiO1xuICAgIH1cbiAgICAvLyBBc3N1bWUgdGhleSdyZSB0cnlpbmcgdG8gZG8gdGhlIGxhdGVzdCwgMS4yIHBhdHRlcm5cbiAgICByZXR1cm4gXCIxLjJcIjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2Rlc2lnbl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImNvbWJvYm94X3ZlcnNpb25cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlBhc3NfMS4wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiRmFpbF8xLjFcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJQYXNzXzEuMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMCwgd2hpY2ggaXMgYWxsb3dlZCBieSBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMSwgd2hpY2ggaXMgbm90IGFsbG93ZWQgYnkgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gbXVzdCBiZSB2YWxpZCBmb3IgQVJJQSAxLjJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF0dGVybiA9IHBhdHRlcm5EZXRlY3QocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFdlIGRvbid0IGFzc2VzcyBuYXRpdmUgc2VsZWN0IGVsZW1lbnRzIGhlcmVcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiaW1wbGljaXRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGV4cGFuZGVkID0gKEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1leHBhbmRlZFwiKSB8fCBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgIGxldCBlZGl0YWJsZSA9IHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgfHwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIik7XG5cbiAgICAgICAgbGV0IGtleSA9IGNvbnRleHRbXCJkb21cIl0ucm9sZVBhdGg7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY2FjaGVba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBcImlucHV0RWxlbWVudFwiOiBlZGl0YWJsZSA/IHJ1bGVDb250ZXh0IDogbnVsbCxcbiAgICAgICAgICAgICAgICBcInBhdHRlcm5cIjogcGF0dGVybixcbiAgICAgICAgICAgICAgICBcImV4cGFuZGVkXCI6IGV4cGFuZGVkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8geHBhdGg/XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzEuMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMlwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfdGFiYmFibGVfY2hpbGRcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJET00gZm9jdXMgaXMgYWxsb3dlZCBvbmx5IG9uIHRoZSBjb21ib2JveCBlbGVtZW50IGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X3RhYmJhYmxlXCI6IFwiVGhlIGNvbWJvYm94IGVsZW1lbnQgZG9lcyBub3QgYWxsb3cgRE9NIGZvY3VzIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfdGFiYmFibGVfY2hpbGRcIjogXCJUaGUgcG9wdXAgb2YgdGhlIGNvbWJvYm94IGhhcyBET00gZm9jdXMgb3IgaGFzICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGRlZmluZWQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFiYmFibGUgZm9jdXMgZm9yIHRoZSBjb21ib2JveCBtdXN0IGJlIGFsbG93ZWQgb25seSBvbiB0aGUgdGV4dCBpbnB1dCwgZXhjZXB0IHdoZW4gdXNpbmcgYSBkaWFsb2cgcG9wdXBcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGlmICghY2FjaGUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBwb3B1cFJvbGUgPSBBcmlhVXRpbC5nZXRSb2xlcyhwb3B1cEVsZW1lbnQsIHRydWUpWzBdO1xuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXVxuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF9ub3RfdGFiYmFibGVcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBtYWtlcyBzZW5zZSB0byBjaGVjayB0aGUgcG9wdXAgd2hlbiBleHBhbmRlZFxuICAgICAgICAvLyB0aGlzIGRvZXMgbm90IGFwcGx5IHRvIGRpYWxvZ3MsIHJldHVybiBwYXNzIHNpbmNlIHRoZSBtYWluIGVsZW1lbnQgd2FzIGZvY3VzYWJsZSBhYm92ZVxuICAgICAgICBpZiAoZXhwYW5kZWQgPT09IGZhbHNlIHx8IHBvcHVwUm9sZSA9PT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBpZiBwb3B1cEVsZW1lbnQgaXRzZWxmIGhhcyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHBvcHVwRWxlbWVudCkgJiYgIUFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocG9wdXBFbGVtZW50LCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTs7XG4gICAgICAgICAgICAvLyBpZiBhbnkgY2hpbGQgb2YgcG9wdXBFbGVtZW50IGhhcyBcImFyaWEtYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcG9wdXBFbGVtZW50LmNoaWxkcmVuICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy9sZXQgbncgPSBuZXcgTm9kZVdhbGtlcihwb3B1cEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUobncubm9kZSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJQYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBvciAnYXJpYS1vd25zJyAoQVJJQSAxLjApIGFwcHJvcHJpYXRlbHkgcmVmZXJlbmNlcyBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJUaGUgJ3JvbGUnIHZhbHVlIFxcXCJ7MH1cXFwiIG9mIHRoZSBwb3B1cCBlbGVtZW50IFxcXCJ7MX1cXFwiIHNob3VsZCBiZSBvbmUgb2YgXFxcImxpc3Rib3hcXFwiLCBcXFwiZ3JpZFxcXCIsIFxcXCJ0cmVlXFxcIiBvciBcXFwiZGlhbG9nXFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJUaGUgdmFsdWUgb2YgdGhlIGNvbWJvYm94ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgZG9lcyBub3QgbWF0Y2ggdGhlICdyb2xlJyB2YWx1ZSBvZiB0aGUgcG9wdXAgZWxlbWVudCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb21ib2JveCBhdHRyaWJ1dGUgJ2FyaWEtaGFzcG9wdXAnIHZhbHVlIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSByb2xlIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgb3IgJ2FyaWEtb3ducycgKEFSSUEgMS4wKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBjb25zdCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgaWYgKCFjYWNoZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgY29uc3QgY2FjaGVkRWxlbSA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwSWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCBwb3B1cCByb2xlIGlzIGxpc3Rib3gsIGdyaWQsIHRyZWUsIG9yIGRpYWxvZyBhbmQgdGhhdCBpdCBtYXRjaGVzIHRoZSBjb21ib2JveFxuICAgICAgICBsZXQgcG9wdXBSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHBvcHVwRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wibGlzdGJveFwiLCBcImdyaWRcIiwgXCJ0cmVlXCIsIFwiZGlhbG9nXCJdLmZpbHRlcigodmFsaWRSb2xlKSA9PiBwb3B1cFJvbGVzLmluY2x1ZGVzKHZhbGlkUm9sZSkpO1xuICAgICAgICBpZiAodmFsaWRSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCIsIFtwb3B1cFJvbGVzLmpvaW4oXCIsXCIpLCBwb3B1cElkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcG9wdXBSb2xlID0gdmFsaWRSb2xlc1swXTtcbiAgICAgICAgICAgIGxldCBoYXNwb3B1cFZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgfHwgXCJsaXN0Ym94XCI7XG4gICAgICAgICAgICAvLyBQb3B1cCByb2xlIG11c3QgbWF0Y2ggYXJpYS1oYXNwb3B1cCB1bmxlc3MgcG9wdXBSb2xlIGlzIGxpc3Rib3gsIHRoZW4gYXJpYS1oYXNwb3B1cCBzaG91bGQgbm90IGJlIGRlZmluZWQgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaGFzcG9wdXBWYWwgIT09IHBvcHVwUm9sZSkge1xuICAgICAgICAgICAgICAgIGlmIChwb3B1cFJvbGUgIT09IFwibGlzdGJveFwiIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCIsIFtoYXNwb3B1cFZhbCwgcG9wdXBSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKGZvciBBUklBIDEuMikgb3IgdGhlICdhcmlhLW93bnMnIChmb3IgQVJJQSAxLjApIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggbXVzdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgZXhpc3RzIGFuZCBpcyB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgdmlzaWJsZSBwb3B1cCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJUaGUgJ2FyaWEtb3ducycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggaXMgbWlzc2luZ1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIHRydWUsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIGZhbHNlLCBidXQgdGhlIGNvbWJvYm94IHBvcHVwIGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNGU4YWI2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBhdHRlcm4sIGV4cGFuZGVkIH0gPSBjYWNoZWRFbGVtO1xuXG4gICAgICAgIGxldCBwb3B1cElkO1xuICAgICAgICBsZXQgcG9wdXBFbGVtZW50O1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcHVwSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcG9wdXBJZCk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIiwgW3BvcHVwSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3B1cElkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKTtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBwb3B1cElkKTtcbiAgICAgICAgICAgIGlmICghcG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiLCBbcG9wdXBJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBoYXZlIGFuIGVsZW1lbnQsIHN0aWNrIGl0IGluIHRoZSBjYWNoZSBhbmQgdGhlbiBjaGVjayBpdHMgcm9sZVxuICAgICAgICBjYWNoZWRFbGVtLnBvcHVwSWQgPSBwb3B1cElkO1xuICAgICAgICBjYWNoZWRFbGVtLnBvcHVwRWxlbWVudCA9IHBvcHVwRWxlbWVudDtcblxuXG4gICAgICAgIGlmIChleHBhbmRlZCAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKCFleHBhbmRlZCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMF9leHBhbmRlZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjBfY29sbGFwc2VkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJfZXhwYW5kZWRcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMS4yX2NvbGxhcHNlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBkZWJ1Z19wYXRoczogUnVsZSA9IHtcbiAgICBpZDogXCJkZWJ1Z19wYXRoc1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIkRFQlVHXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiZG9tUGF0aFwiLCBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoKTtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiYXJpYVBhdGhcIiwgY29udGV4dFtcImFyaWFcIl0ucm9sZVBhdGgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRldGVjdG9yX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImRldGVjdG9yX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiRVhURU5TSU9OU1wiXSxcbiAgICAgICAgbnVtOiBcIjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhpZXJDb250ZXh0ID0gY29udGV4dEhpZXJhcmNoaWVzLmFyaWFbY29udGV4dEhpZXJhcmNoaWVzLmFyaWEubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbXSwgW3tcbiAgICAgICAgICAgIG5hbWU6IGhpZXJDb250ZXh0LmF0dHJpYnV0ZXMubmFtZSxcbiAgICAgICAgICAgIHJvbGU6IGhpZXJDb250ZXh0LnJvbGUsXG4gICAgICAgICAgICB0YWJpbmRleDogcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgXCIwXCIpXG4gICAgICAgIH1dKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRpcl9hdHRyaWJ1dGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbZGlyXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9FbGVtX0RpclZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbnZhbGlkIHZhbHVlIHVzZWQgZm9yIHRoZSAnZGlyJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInZGlyJyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBcXFwibHRyXFxcIiwgXFxcInJ0bFxcXCIsIG9yIFxcXCJhdXRvXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZGlyU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZGlyXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBkaXJTdHIgPT0gXCJsdHJcIiB8fCBkaXJTdHIgPT0gXCJydGxcIiB8fCBkaXJTdHIgPT0gXCJhdXRvXCI7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YVtocmVmXSxkb206YXJlYVtocmVmXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19NZWRpYV9Eb2N1bWVudFRyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGZpbGUgZG93bmxvYWQgbWVjaGFuaXNtIGRvZXMgbm90IGNhdXNlIGEga2V5Ym9hcmQgdHJhcFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZpbGUgZG93bmxvYWQgbWVjaGFuaXNtcyBzaG91bGQgYmUga2V5Ym9hcmQtb3BlcmFibGUgYW5kIHByZXNlcnZlIHBhZ2UgZm9jdXMgbG9jYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaHJlZiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIGxldCBleHQgPSBDb21tb25VdGlsLmdldEZpbGVFeHQoaHJlZik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhW1wiLmRvY3hcIiwgXCIuZG9jXCIsIFwiLnBkZlwiLCBcIi5vZHRcIl0uaW5jbHVkZXMoZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZVBvdGVudGlhbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbZHJhZ2dhYmxlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwicGFzc19hbHRlcm5hdGl2ZVwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX3VuZHJhZ2dhYmxlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9hbHRlcm5hdGl2ZVwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgZHJhZ2dhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgXFxcInNpbmdsZSBwb2ludGVyXFxcIiBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzX2FsdGVybmF0aXZlXCI6IFwiVGhlIGRyYWdnYWJsZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGhhcyBhIFxcXCJzaW5nbGUgcG9pbnRlclxcXCIgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwicGFzc191bmRyYWdnYWJsZVwiOiBcIlRoZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGlzIG5vdCBkcmFnZ2FibGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCI6IFwiRW5zdXJlIHRoZSBkcmFnZ2FibGUgZWxlbWVudCBcXFwiezB9XFxcIiBoYXMgYSBcXFwic2luZ2xlIHBvaW50ZXJcXFwiIGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi41LjdcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpOyBcbiAgICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsIFxuICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT09IFwiYm9keVwiIHx8IG5vZGVOYW1lID09PSBcImh0bWxcIiApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIikgPT09ICd0cnVlJykgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9hbHRlcm5hdGl2ZVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgZWxzZSBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpID09PSAnZmFsc2UnKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfdW5kcmFnZ2FibGVcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY2Nlc3NrZXlfTmVlZExhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggYW4gYXNzaWduZWQgJ2FjY2Vzc2tleScgYXR0cmlidXRlIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy9za2lwIGlmIHRoZSBlbGVtZW50IGlzIHRhYmJhYmxlLCBpdCdzIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAvL3NraXAgdGhlIG5hdGl2ZSBlbGVtZW50LCBtb3N0bHkgdGV4dCBlbGVtZW50c1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV1cbiAgICAgICAgaWYgKCFwYXR0ZXJucyB8fCAhcGF0dGVybnMubmFtZUZyb20pIFxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhY2Nlc3NibGUgbmFtZSBpcyByZXF1aXJlZCAoY2hlY2tlZCBpbiBvdGhlciBydWxlcykgb3IgcHJvaGliaXRlZCAodGV4dCBlbGVtZW50KSAgICBcbiAgICAgICAgaWYgKHBhdHRlcm5zLm5hbWVSZXF1aXJlZCB8fCAhcGF0dGVybnMubmFtZUZyb20gfHwgcGF0dGVybnMubmFtZUZyb20uaW5jbHVkZXMoXCJwcm9oaWJpdGVkXCIpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9zcGVjaWFsIGNhc2U6IGxlZ2VuZCwgYXMgYSBjaGlsZCBvZiBhIGZpZWxkc2V0LCBkZWxlZ2F0ZSB0aGUgYWNjZXNza2V5IGNvbW1hbmQgdG8gdGhlIGZpZWxkIG9mIHRoZSBmaWVsZHNldCB3aGljaCBpcyBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdmaWVsZHNldCcpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYWNjZXNzaWJsZSBuYW1lIGV4aXN0c1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgLy9pZiAoQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FjY2Vzc2tleV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9FbGVtX1VuaXF1ZUFjY2Vzc0tleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiJ2FjY2Vzc2tleScgYXR0cmlidXRlIHZhbHVlIG9uIHRoZSBlbGVtZW50IGlzIG5vdCB1bmlxdWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWVzIG9uIGVhY2ggZWxlbWVudCBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHBhZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlXCIsIHt9KTtcbiAgXG4gICAgICAgIGxldCBrZXkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhY2Nlc3NrZXlcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICEoa2V5IGluIG1hcCk7XG4gICAgICAgIG1hcFtrZXldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuY29uc3QgREVQUkVDQVRFRF9FTEVNRU5UUyA9IFtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcImFwcGxldFwiLCBcImJhc2Vmb250XCIsIFwiY2VudGVyXCIsIFwiZGlyXCIsIFwiZm9udFwiLCBcImlzaW5kZXhcIiwgXCJsaXN0aW5nXCIsXG4gICAgXCJwbGFpbnRleHRcIiwgXCJzcGFjZXJcIiwgXCJzXCIsIFwic3RyaWtlXCIsIFwidVwiLCBcInhtcFwiLFxuICAgIC8qKiBhZGRlZCBmcm9tIGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS9wZi1zdW1tYXJ5L29ic29sZXRlLmh0bWwgKi9cbiAgICBcImFjcm9ueW1cIiwgXCJmcmFtZVwiLCBcImZyYW1lc2V0XCIsIFwibm9mcmFtZXNcIiwgXCJub2VtYmVkXCIsIFwiYmlnXCIsIFwiYmxpbmtcIiwgXCJtYXJxdWVlXCIsIFwidHRcIixcblxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0hUTUxfR0xPQkFMX0FUVFJJQlVURVMgPSBbXG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJhbGlnblwiLCBcImxpbmtcIiwgXCJhcmNoaXZlXCIsIFwiYmFja2dyb3VuZFwiLCBcImJnY29sb3JcIiwgXCJjbGVhclwiLCBcImNvZGVcIiwgXCJjb2xvclwiLFxuICAgIFwiY29tcGFjdFwiLCBcImZhY2VcIiwgXCJoc3BhY2VcIiwgXCJsYW5ndWFnZVwiLCBcImxpbmtcIiwgXCJub3NoYWRlXCIsIFwibm93cmFwXCIsIFwib2JqZWN0XCIsXG4gICAgXCJwcm9tcHRcIiwgXCJzdGFydFwiLCBcInRleHRcIiwgXCJ2ZXJzaW9uXCIsIFwidmxpbmtcIiwgXCJ2c3BhY2VcIlxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFUyA9IHtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcInRkXCI6IFtcImhlaWdodFwiLCBcIndpZHRoXCIsIFwiYWJiclwiLCBcImF4aXNcIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcImhlaWdodFwiLCBcIm5vd3JhcFwiLCBcInZhbGlnblwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIiwgXCJiZ2NvbG9yXCJdLFxuICAgIFwidGhcIjogW1wiaGVpZ2h0XCIsIFwid2lkdGhcIiwgXCJhYmJyXCIsIFwiYXhpc1wiLCBcImNoYXJvZmZcIiwgXCJoZWlnaHRcIiwgXCJiZ2NvbG9yXCIsIFwiYWxpZ25cIiwgXCJub3dyYXBcIiwgXCJjaGFyXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJsaVwiOiBbXCJ0eXBlXCIsIFwidmFsdWVcIiwgXCJ0eXBlXCJdLFxuICAgIFwidWxcIjogW1widHlwZVwiLCBcImNvbXBhY3RcIl0sXG4gICAgXCJwcmVcIjogW1wid2lkdGhcIl0sXG5cbiAgICAvKiogYWRkZWQgZnJvbSBodHRwczovL2Rldi53My5vcmcvaHRtbDUvcGYtc3VtbWFyeS9vYnNvbGV0ZS5odG1sICovXG4gICAgXCJtZXRhXCI6IFtcImh0dHAtZXF1aXZcIl0sXG4gICAgXCJhXCI6IFtcImNoYXJzZXRcIiwgXCJjb29yZHNcIiwgXCJzaGFwZVwiLCBcInJldlwiLCBcInNjaGVtZVwiXSxcbiAgICBcImxpbmtcIjogW1wicmV2XCIsIFwiY2hhcnNldFwiLCBcInRhcmdldFwiXSxcbiAgICBcImltZ1wiOiBbXCJuYW1lXCIsIFwibG9uZ2Rlc2NcIiwgXCJhbGlnblwiLCBcImhzcGFjZVwiLCBcInZzcGFjZVwiLCBcImJvcmRlclwiXSxcbiAgICBcImFyZWFcIjogW1wibm9ocmVmXCJdLFxuICAgIFwiaGVhZFwiOiBbXCJwcm9maWxlXCJdLFxuICAgIFwiaHRtbFwiOiBbXCJ2ZXJzaW9uXCJdLFxuICAgIFwiaWZyYW1lXCI6IFtcImxvbmdkZXNjXCIsIFwiYWxpZ25cIiwgXCJmcmFtZWJvcmRlclwiLCBcIm1hcmdpbmhlaWdodFwiLCBcIm1hcmdpbndpZHRoXCIsIFwic2Nyb2xsaW5nXCJdLFxuICAgIFwib2JqZWN0XCI6IFtcImFyY2hpdmVcIiwgXCJjb2RlXCIsIFwiY29kZWJhc2VcIiwgXCJjb2RldHlwZVwiLCBcImRlY2xhcmVcIiwgXCJzdGFuZGJ5XCIsIFwiYWxpZ25cIiwgXCJoc3BhY2VcIiwgXCJ2c3BhY2VcIiwgXCJib3JkZXJcIl0sXG4gICAgXCJwYXJhbVwiOiBbXCJ0eXBlXCIsIFwidmFsdWV0eXBlXCJdLFxuICAgIFwic2NyaXB0XCI6IFtcImxhbmd1YWdlXCJdLFxuICAgIFwiYm9keVwiOiBbXCJhbGlua1wiLCBcImJhY2tncm91bmRcIiwgXCJiZ2NvbG9yXCIsIFwibGlua1wiLCBcInRleHRcIiwgXCJ2bGlua1wiXSxcbiAgICBcImJyXCI6IFtcImNsZWFyXCJdLFxuICAgIFwiY2FwdGlvblwiOiBbXCJhbGlnblwiXSxcbiAgICBcImNvbFwiOiBbXCJhbGlnblwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJkaXZcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJkbFwiOiBbXCJjb21wYWN0XCJdLFxuICAgIFwiaHJcIjogW1wiYWxpZ25cIiwgXCJub3NoYWRlXCIsIFwic2l6ZVwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJoMlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImgzXCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNVwiOiBbXCJhbGlnblwiXSxcbiAgICBcImg2XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaW5wdXRcIjogW1wiYWxpZ25cIiwgXCJ1c2VtYXBcIl0sXG4gICAgXCJsZWdlbmRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJtZW51XCI6IFtcImNvbXBhY3RcIl0sXG4gICAgXCJvbFwiOiBbXCJjb21wYWN0XCIsIFwidHlwZVwiLCBcInR5cGVcIl0sXG4gICAgXCJwXCI6IFtcImFsaWduXCJdLFxuICAgIFwidGFibGVcIjogW1wiYmdjb2xvclwiLCBcImNlbGxwYWRkaW5nXCIsIFwiY2VsbHNwYWNpbmdcIiwgXCJmcmFtZVwiLCBcInJ1bGVzXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiXSxcbiAgICBcInRib2R5XCI6IFtcImFsaWduXCIsIFwiY2hhclwiLCBcInZhbGlnblwiLCBcImNoYXJvZmZcIl0sXG4gICAgXCJ0Zm9vdFwiOiBbXCJhbGlnblwiLCBcImNoYXJvZmZcIiwgXCJjaGFyXCIsIFwidmFsaWduXCJdLFxuICAgIFwidGhlYWRcIjogW1wiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIiwgXCJhbGlnblwiXSxcbiAgICBcInRyXCI6IFtcImFsaWduXCIsIFwiYmdjb2xvclwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCJdXG59XG5cbmZ1bmN0aW9uIGFycmF5VG9Db250ZXh0U3RyKG9iaiwgdHlwZSkge1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aCgnLCAnKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdIVE1MX0VMRU1FTlRTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOicgKyBwcm9wO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnSFRNTF9BVFRSSUJVVEVTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOipbJyArIHByb3AgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gb2JqVG9Db250ZXh0U3RyKG9iaiwgdHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKCcsICcpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0hUTUxfRUxFTUVOVF9BVFRSSUJVVEVTJykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9ialtwcm9wXSBhcyBTdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoXCIsIFwiKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJ2RvbTonICsgcHJvcCArICdbJyArIGl0ZW0gKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTphcHBsZXQsIGRvbTpiYXNlZm9udCwgZG9tOmNlbnRlciwgZG9tOmRpciwgZG9tOmZvbnQsIGRvbTppc2luZGV4LCBkb206bGlzdGluZywgZG9tOm1lbnUsIGRvbTpwbGFpbnRleHQsIGRvbTpzcGFjZXIsIGRvbTpzLCBkb206c3RyaWtlLCBkb206dSwgZG9tOnhtcCwgZG9tOmFjcm9ueW0sIGRvbTpmcmFtZSwgZG9tOmZyYW1lc2V0LCBkb206bm9mcmFtZXMsIGRvbTpub2VtYmVkLCBkb206YmlnLCBkb206YmxpbmssIGRvbTptYXJxdWVlLCBkb206dHROYU5kb206KlthbGlnbl0sIGRvbToqW2xpbmtdLCBkb206KlthcmNoaXZlXSwgZG9tOipbYmFja2dyb3VuZF0sIGRvbToqW2JnY29sb3JdLCBkb206KltjbGVhcl0sIGRvbToqW2NvZGVdLCBkb206Kltjb2xvcl0sIGRvbToqW2NvbXBhY3RdLCBkb206KltmYWNlXSwgZG9tOipbaHNwYWNlXSwgZG9tOipbbGFuZ3VhZ2VdLCBkb206KltsaW5rXSwgZG9tOipbbm9zaGFkZV0sIGRvbToqW25vd3JhcF0sIGRvbToqW29iamVjdF0sIGRvbToqW3Byb21wdF0sIGRvbToqW3N0YXJ0XSwgZG9tOipbdGV4dF0sIGRvbToqW3ZlcnNpb25dLCBkb206Klt2bGlua10sIGRvbToqW3ZzcGFjZV1OYU5kb206dGRbaGVpZ2h0XSwgZG9tOnRkW3dpZHRoXSwgZG9tOnRkW2FiYnJdLCBkb206dGRbYXhpc10sIGRvbTp0ZFtjaGFyXSwgZG9tOnRkW2NoYXJvZmZdLCBkb206dGRbaGVpZ2h0XSwgZG9tOnRkW25vd3JhcF0sIGRvbTp0ZFt2YWxpZ25dLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWxpZ25dLCBkb206dGRbYmdjb2xvcl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbd2lkdGhdLCBkb206dGhbYWJicl0sIGRvbTp0aFtheGlzXSwgZG9tOnRoW2NoYXJvZmZdLCBkb206dGhbaGVpZ2h0XSwgZG9tOnRoW2JnY29sb3JdLCBkb206dGhbYWxpZ25dLCBkb206dGhbbm93cmFwXSwgZG9tOnRoW2NoYXJdLCBkb206dGhbdmFsaWduXSwgZG9tOnRoW3dpZHRoXSwgZG9tOmxpW3R5cGVdLCBkb206bGlbdmFsdWVdLCBkb206bGlbdHlwZV0sIGRvbTp1bFt0eXBlXSwgZG9tOnVsW2NvbXBhY3RdLCBkb206cHJlW3dpZHRoXSwgZG9tOm1ldGFbaHR0cC1lcXVpdl0sIGRvbTphW2NoYXJzZXRdLCBkb206YVtjb29yZHNdLCBkb206YVtzaGFwZV0sIGRvbTphW3Jldl0sIGRvbTphW3NjaGVtZV0sIGRvbTpsaW5rW3Jldl0sIGRvbTpsaW5rW2NoYXJzZXRdLCBkb206bGlua1t0YXJnZXRdLCBkb206aW1nW25hbWVdLCBkb206aW1nW2xvbmdkZXNjXSwgZG9tOmltZ1thbGlnbl0sIGRvbTppbWdbaHNwYWNlXSwgZG9tOmltZ1t2c3BhY2VdLCBkb206aW1nW2JvcmRlcl0sIGRvbTphcmVhW25vaHJlZl0sIGRvbTpoZWFkW3Byb2ZpbGVdLCBkb206aHRtbFt2ZXJzaW9uXSwgZG9tOmlmcmFtZVtsb25nZGVzY10sIGRvbTppZnJhbWVbYWxpZ25dLCBkb206aWZyYW1lW2ZyYW1lYm9yZGVyXSwgZG9tOmlmcmFtZVttYXJnaW5oZWlnaHRdLCBkb206aWZyYW1lW21hcmdpbndpZHRoXSwgZG9tOmlmcmFtZVtzY3JvbGxpbmddLCBkb206b2JqZWN0W2FyY2hpdmVdLCBkb206b2JqZWN0W2NvZGVdLCBkb206b2JqZWN0W2NvZGViYXNlXSwgZG9tOm9iamVjdFtjb2RldHlwZV0sIGRvbTpvYmplY3RbZGVjbGFyZV0sIGRvbTpvYmplY3Rbc3RhbmRieV0sIGRvbTpvYmplY3RbYWxpZ25dLCBkb206b2JqZWN0W2hzcGFjZV0sIGRvbTpvYmplY3RbdnNwYWNlXSwgZG9tOm9iamVjdFtib3JkZXJdLCBkb206cGFyYW1bdHlwZV0sIGRvbTpwYXJhbVt2YWx1ZXR5cGVdLCBkb206c2NyaXB0W2xhbmd1YWdlXSwgZG9tOmJvZHlbYWxpbmtdLCBkb206Ym9keVtiYWNrZ3JvdW5kXSwgZG9tOmJvZHlbYmdjb2xvcl0sIGRvbTpib2R5W2xpbmtdLCBkb206Ym9keVt0ZXh0XSwgZG9tOmJvZHlbdmxpbmtdLCBkb206YnJbY2xlYXJdLCBkb206Y2FwdGlvblthbGlnbl0sIGRvbTpjb2xbYWxpZ25dLCBkb206Y29sW2NoYXJdLCBkb206Y29sW2NoYXJvZmZdLCBkb206Y29sW3ZhbGlnbl0sIGRvbTpjb2xbd2lkdGhdLCBkb206ZGl2W2FsaWduXSwgZG9tOmRsW2NvbXBhY3RdLCBkb206aHJbYWxpZ25dLCBkb206aHJbbm9zaGFkZV0sIGRvbTpocltzaXplXSwgZG9tOmhyW3dpZHRoXSwgZG9tOmhyW2FsaWduXSwgZG9tOmgyW2FsaWduXSwgZG9tOmgzW2FsaWduXSwgZG9tOmg0W2FsaWduXSwgZG9tOmg1W2FsaWduXSwgZG9tOmg2W2FsaWduXSwgZG9tOmlucHV0W2FsaWduXSwgZG9tOmlucHV0W3VzZW1hcF0sIGRvbTpsZWdlbmRbYWxpZ25dLCBkb206bWVudVtjb21wYWN0XSwgZG9tOm9sW2NvbXBhY3RdLCBkb206b2xbdHlwZV0sIGRvbTpvbFt0eXBlXSwgZG9tOnBbYWxpZ25dLCBkb206dGFibGVbYmdjb2xvcl0sIGRvbTp0YWJsZVtjZWxscGFkZGluZ10sIGRvbTp0YWJsZVtjZWxsc3BhY2luZ10sIGRvbTp0YWJsZVtmcmFtZV0sIGRvbTp0YWJsZVtydWxlc10sIGRvbTp0YWJsZVt3aWR0aF0sIGRvbTp0YWJsZVthbGlnbl0sIGRvbTp0Ym9keVthbGlnbl0sIGRvbTp0Ym9keVtjaGFyXSwgZG9tOnRib2R5W3ZhbGlnbl0sIGRvbTp0Ym9keVtjaGFyb2ZmXSwgZG9tOnRmb290W2FsaWduXSwgZG9tOnRmb290W2NoYXJvZmZdLCBkb206dGZvb3RbY2hhcl0sIGRvbTp0Zm9vdFt2YWxpZ25dLCBkb206dGhlYWRbY2hhcl0sIGRvbTp0aGVhZFtjaGFyb2ZmXSwgZG9tOnRoZWFkW3ZhbGlnbl0sIGRvbTp0aGVhZFthbGlnbl0sIGRvbTp0clthbGlnbl0sIGRvbTp0cltiZ2NvbG9yXSwgZG9tOnRyW2NoYXJdLCBkb206dHJbY2hhcm9mZl0sIGRvbTp0clt2YWxpZ25dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1cIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hdHRyXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbV9hdHRyXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1cIjogXCJUaGUgPHswfT4gZWxlbWVudCBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJUaGUgSFRNTCBhdHRyaWJ1dGUocykgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJUaGUgSFRNTCBhdHRyaWJ1dGUocykgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBmb3IgdGhlIDx7MX0+IGVsZW1lbnQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXZvaWQgdXNlIG9mIG9ic29sZXRlIGZlYXR1cmVzIGlmIHBvc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gSFRNTFVuaXQgYXV0byBhZGRzIGEgdGJvZHlbYWxpZ249bGVmdF0gdG8gdGFibGVzIGlmIHRib2R5IGlzIG1pc3NpbmchXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRib2R5XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWxpZ25cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdlYmNvbXBvbmVudCBlbGVtZW50LCBIVE1MIGRvZXNuJ3QgZGVmaW5lIHdoYXQncyBkZXByZWNhdGVkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKERFUFJFQ0FURURfRUxFTUVOVFMuaW5jbHVkZXMobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VsZW1cIiwgW25vZGVOYW1lXSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIEhUTUwgZ2xvYmFsIGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBhdHRycyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgICAgIGxldCB2aW9sYXRpb25zID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRycykge1xuICAgICAgICAgICAgaWYgKERFUFJFQ0FURURfSFRNTF9HTE9CQUxfQVRUUklCVVRFUy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykgdmlvbGF0aW9ucyArPSAnLCAnO1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgKz0gYXR0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYXR0clwiLCBbdmlvbGF0aW9uc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgSFRNTCBlbGVtZW50ICYgYXR0cmlidXRlXG4gICAgICAgIHZpb2xhdGlvbnMgPSAnJztcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVNbbm9kZU5hbWVdICYmIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTW25vZGVOYW1lXS5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHZpb2xhdGlvbnMgKz0gJywgJztcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucyArPSBhdHRyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZWxlbV9hdHRyXCIsIFt2aW9sYXRpb25zLCBub2RlTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KltpZF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbGVtX1VuaXF1ZUlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50ICdpZCcgYXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgaGFzIHRoZSBpZCBcXFwiezF9XFxcIiB0aGF0IGlzIGFscmVhZHkgaW4gdXNlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJIVE1MXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCIzZWEwYzhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBpZCBpcyBlbXB0eSB3ZSBzaG91bGQgdHJpZ2dlciBhIHZpb2xhdGlvbiByaWdodCBhd2F5IHdpdGggb3V0IGNoZWNraW5nIFxuICAgICAgICAvLyBmb3IgdW5pcXVlbmVzcy5cbiAgICAgICAgaWYgKGlkID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGVsZW1lbnQgPT09IHJ1bGVDb250ZXh0O1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgZVJ1bGVDb25maWRlbmNlIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBMYW5nVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmNvbnN0IHZhbGlkYXRlTGFuZyA9IChjb250ZXh0OiBSdWxlQ29udGV4dCk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gSXQncyBva2F5IHRvIGhhdmUgYSBsYW5nPVwiXCIgaWYgbm90IG9uIGh0bWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYW5nU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInhtbDpsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLmlzQmNwNDcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX2xhbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sW2xhbmddLCBkb206aHRtbFt4bWw6bGFuZ11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImh0bWxfbGFuZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkxhbmcgaGFzIGEgdmFsaWQgcHJpbWFyeSBsYW5nIGFuZCBjb25mb3JtcyB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBkZWZhdWx0IGh1bWFuIGxhbmd1YWdlIG9mIHRoZSBwYWdlIG11c3QgYmUgdmFsaWQgYW5kIHNwZWNpZmllZCBpbiBhY2NvcmRhbmNlIHdpdGggQkNQIDQ3XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI1YzNmOFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmYwNTFhXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICAvLyBUT0RPOiBBQ1Q6IE1pc21hdGNoIGJlY2F1c2UgdGhleSBkb24ndCBjaGVjayB0aGUgaHRtbCBlbGVtZW50IGluIHRoZSBzYW1lIHJ1bGVcbiAgICAgICAgLy8gXCJkZTQ2ZTRcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCByZWFzb25Db2RlID0gdmFsaWRhdGVMYW5nKGNvbnRleHQpO1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHZhbGlkYXRlTGFuZyBzbyB0aGF0IHRoZSBnZW5IZWxwIGNvZGUgd2lsbCBwaWNrIGl0IHVwXG4gICAgICAgIGxldCByZXRBcnIgPSBbXG4gICAgICAgICAgICBSdWxlUGFzcyhcIlBhc3NfMFwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8xXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzJcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfM1wiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF80XCIpXG4gICAgICAgIF1cbiAgICAgICAgcmV0dXJuIHJldEFycltyZWFzb25Db2RlXTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KltsYW5nXSwgZG9tOipbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY2hhbmdlIGluIGxhbmd1YWdlIG9mIHNwZWNpZmljIGNvbnRlbnQgbXVzdCBiZSB2YWxpZCBhbmQgc3BlY2lmaWVkIGluIGFjY29yZGFuY2Ugd2l0aCBCQ1AgNDdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgLy8gXCJiNWMzZjhcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBcImJmMDUxYVwiOiB7XG4gICAgICAgIC8vICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBJZiBpdCdzIHRoZSBIVE1MIG5vZGUsIHRoYXQncyBoYW5kbGVkIGJ5IGh0bWxfbGFuZ192YWxpZFxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaHRtbFwiKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHJlYXNvbkNvZGUgPSB2YWxpZGF0ZUxhbmcoY29udGV4dCk7XG4gICAgICAgIC8vIFRoaXMgaXMgZG9uZSBoZXJlIGluc3RlYWQgb2YgaW4gdmFsaWRhdGVMYW5nIHNvIHRoYXQgdGhlIGdlbkhlbHAgY29kZSB3aWxsIHBpY2sgaXQgdXBcbiAgICAgICAgbGV0IHJldEFyciA9IFtcbiAgICAgICAgICAgIFJ1bGVQYXNzKFwiUGFzc18wXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzFcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMlwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8zXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzRcIilcbiAgICAgICAgXVxuICAgICAgICBsZXQgcmV0VmFsID0gcmV0QXJyW3JlYXNvbkNvZGVdO1xuICAgICAgICBpZiAocmV0VmFsLnZhbHVlWzFdICE9PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUncyBhY3R1YWxseSBjb250ZW50IG9mIHRoaXMgZWxlbWVudCAtIHNraXAgc3VidHJlZXMgdGhhdCBoYXZlIG90aGVyIGxhbmcgYXR0cmlidXRlc1xuICAgICAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgZmFsc2UsIHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBudy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImxhbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gaGFzQ29udGVudCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShlbGVtZW50KS50cmltKCkubGVuZ3RoID4gMCovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25kYmxjbGlja10sIGRvbToqW29ubW91c2Vtb3ZlXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ubW91c2VvdXRdLCBkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fRXZlbnRNb3VzZUFuZEtleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIHRoZSA8ezB9PiBlbGVtZW50IHdpdGggbW91c2UgZXZlbnQgaGFuZGxlcihzKSAnezF9JyBoYXMgYSBjb3JyZXNwb25kaW5nIGtleWJvYXJkIGhhbmRsZXIocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgaW50ZXJhY3RpdmUgY29udGVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBlcXVpdmFsZW50IGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmRibGNsaWNrXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNldXBcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdmVyXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uYmx1clwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2xpY2tcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiKSk7XG5cbiAgICAgICAgbGV0IGZhaWxlZE1vdXNlRXZlbnRzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL3N0b3JlIGFuZCBkaXNwbGF5IGV2ZW50IG5hbWUgYW5kIG5vZGUgbmFtZSBpbiB0aGUgdG9rZW5zXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmRibGNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vtb3ZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vkb3duXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZWRvd25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2V1cFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlb3ZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW91dFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpXG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiLCBbbm9kZU5hbWUsIGZhaWxlZE1vdXNlRXZlbnRzLmpvaW4oXCIsIFwiKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImZhaWxfbG9ja2VkXCI6IFwiVGhlIGVsZW1lbnQgPHswfT4gaXMgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyBzaG91bGQgbm90IGJlIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbJ2IzM2VmZiddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCBpbnZpc2libGUgZWxlbWVudFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwibWV0YVwiLCBcInRpdGxlXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGNhY2hlIHRoZSBvcmllbnRhdGlvbiByZXN1bHQgZm9yIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHBhZ2VcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSBhcyBhbnk7XG4gICAgICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTUVESUFfT1JJRU5UQVRJT05fVFJBTlNGUk9NXCIsIG51bGwpO1xuICAgICAgICBpZiAoIW9yaWVudGF0aW9uVHJhbnNmb3Jtcykge1xuICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gQ1NTVXRpbC5nZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYyk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTUVESUFfT1JJRU5UQVRJT05fVFJBTlNGUk9NXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICAvLyBmaW5kIGlmIHRoZSBlbGVtZW50IG1hdGNoZXMgb3JpZW50YXRpb24gc2VsZWN0b3IocylcbiAgICAgICAgbGV0IG1lZGlhX3RyYW5zZm9ybXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XSkuZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XVt0YWddKS5sZW5ndGggPiAwICYmIENTU1V0aWwuc2VsZWN0b3JNYXRjaGVzRWxlbShydWxlQ29udGV4dCwgdGFnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXS50cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV90cmFuc2Zvcm1zLnB1c2gob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXS50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV90cmFuc2Zvcm1zLnB1c2gob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXSk7XG4gICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIG5vIG1hdGNoLCB0aGUgZWxlbWVudCBpcyBub3QgaW4gbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtXG4gICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1lZGlhX3RyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtZWRpYV90cmFuc2Zvcm0gPSBtZWRpYV90cmFuc2Zvcm1zW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZWRpYV90cmFuc2Zvcm0gPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgICAgIGZvcih2YXIga2V5IGluIG1lZGlhX3RyYW5zZm9ybSlcbiAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3JtID0ga2V5ICtcIihcIiArIG1lZGlhX3RyYW5zZm9ybVtrZXldICtcIilcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGNvbnRhaW5zUm90YXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIFsncm90YXRlJywgJ3JvdGF0ZTNkJywgJ3JvdGF0ZVonLCAnbWF0cml4JywgJ21hdHJpeDNkJ10uZm9yRWFjaChyb3RhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1lZGlhX3RyYW5zZm9ybS5pbmNsdWRlcyhyb3RhdGlvbikpIGNvbnRhaW5zUm90YXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBubyByb3RhdGlvbiB0cmFuc2Zvcm0sIHNraXBcbiAgICAgICAgICAgIGlmICghY29udGFpbnNSb3RhdGlvbikgY29udGludWU7XG5cbiAgICAgICAgICAgIGxldCBkZWdyZWUgPSBDU1NVdGlsLmdldFJvdGF0aW9uRGVncmVlKG1lZGlhX3RyYW5zZm9ybSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIG5vIG9yIDM2MG4gZGVncmVlIHJvdGF0aW9uIFxuICAgICAgICAgICAgaWYgKGRlZ3JlZSA9PT0gMCkgeyBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBjYWxjdWxhdGUgdGhlIG9yaWdpbmFsIHBhZ2Ugcm90YXRpb24gdHJhbnNmb3JtYXRpb24sIGV4YW1wbGVcbiAgICAgICAgICAgICAqICBodG1sIHsgdHJhbnNmb3JtOiByb3RhdGUoMi41ZGVnKTsgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZSA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIGNvbXBlbnNhdGUgdGhlIG1lZGlhIG9yaWVudGF0aW9uIHdpdGggdGhlIHBhZ2Ugb3JpZW50YXRpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGRlZmluZWRTdHlsZVsndHJhbnNmb3JtJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlX2RlZ3JlZSA9IENTU1V0aWwuZ2V0Um90YXRpb25EZWdyZWUoZGVmaW5lZFN0eWxlWyd0cmFuc2Zvcm0nXSk7XG4gICAgICAgICAgICAgICAgLy8gcm90YXRlIGlzIGFkZGl0aXZlXG4gICAgICAgICAgICAgICAgZGVncmVlICs9IHBhZ2VfZGVncmVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2hlbiBkZWdyZWUgaXMgMSB0dXJuICgzNjAgZGVncmVlKSwgaXQgaXMgbm90IGNvbnNpZGVyZWQgYW4gb3JpZW50YXRpb24gbG9ja1xuICAgICAgICAgICAgLy8gYWxsb3cgMSBkZWdyZWUgZmxvYXRpbmcgcmFuZ2UgZm9yIHRoZSByaWdodCBhbmdsZVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRlZ3JlZSAtIDM2MCkgJSAzNjAgPiAxKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sb2NrZWRcIiwgW25vZGVOYW1lXSkpO1xuICAgICAgICAgICAgZWxzZSByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi8vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19pbnRlcmFjdGl2ZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfc2Nyb2xsYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2Nyb2xsYWJsZSBlbGVtZW50cyBzaG91bGQgYmUgdGFiYmFibGUgb3IgY29udGFpbiB0YWJiYWJsZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcInBhc3NfdGFiYmFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IGlzIHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IGhhcyB0YWJiYWJsZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImZhaWxfc2Nyb2xsYWJsZVwiOiBcIlRoZSBzY3JvbGxhYmxlIGVsZW1lbnQgPHswfT4gd2l0aCBub24taW50ZXJhY3RpdmUgY29udGVudCBpcyBub3QgdGFiYmFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiMHNzdzlrXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImlmcmFtZVwiLCBcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIGlmIG5vIHZpc2libGUgY29udGVudFxuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIC8vIG5vdCBzY3JvbGxhYmxlLCBpbmFwcGxpY2FibGVcbiAgICAgICAgaWYgKChzdHlsZXMub3ZlcmZsb3dYID09PSAndmlzaWJsZScgfHwgc3R5bGVzLm92ZXJmbG93WCA9PT0gJ2hpZGRlbicpXG4gICAgICAgICAgICAmJiAoc3R5bGVzLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnIHx8IHN0eWxlcy5vdmVyZmxvd1kgPT09ICdoaWRkZW4nKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgb3ZlcmFsbCBzY3JvbGxhYmxlIGVsZW1lbnQgKGNsaWVudFdpZHRoICsgc2Nyb2xsYmFyV2lkdGggYW5kIGNsaWVudEhlaWdodCArIHNjcm9sbGJhckhlaWdodCkgaXMgdG9vIHNtYWxsIHRvIGJlIHZpc2libGUgb24gc2NyZWVuXG4gICAgICAgIGlmIChNYXRoLm1heChydWxlQ29udGV4dC5vZmZzZXRXaWR0aCwgcnVsZUNvbnRleHQub2Zmc2V0SGVpZ2h0KSA8IDMwIHx8IE1hdGgubWluKHJ1bGVDb250ZXh0Lm9mZnNldFdpZHRoLCBydWxlQ29udGV4dC5vZmZzZXRIZWlnaHQpIDwgMTUpICBcbiAgICAgICAgICAgcmV0dXJuIG51bGw7IFxuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBib3RoIHggYW5kIHkgc2Nyb2xsIGRpc3RhbmNlcyA8IGVsZW1lbnQncyBob3Jpem9udGFsL3ZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgY29uc3QgcGFkZGluZ194ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVzLnBhZGRpbmdMZWZ0LCBydWxlQ29udGV4dCkgKyBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1JpZ2h0LCBydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeSA9IENTU1V0aWwuZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nVG9wLCBydWxlQ29udGV4dCkgKyBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0JvdHRvbSwgcnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuc2Nyb2xsV2lkdGggLSAgcnVsZUNvbnRleHQuY2xpZW50V2lkdGggPCAxICsgcGFkZGluZ194IFxuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuc2Nyb2xsSGVpZ2h0IC0gIHJ1bGVDb250ZXh0LmNsaWVudEhlaWdodCA8IDErIHBhZGRpbmdfeSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gcGFzcyBpZiBlbGVtZW50IGlzIHRhYmJhYmxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc190YWJiYWJsZVwiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBlbGVtZW50IGNvbnRlbnQgaXMgdGFiYmFibGVcbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19pbnRlcmFjdGl2ZVwiKTtcblxuICAgICAgICAvLyBpZ25vcmUgaW4gRmlyZWZveCBpZiBubyB0YWJpbmRleCBhdCBhbGwgKG5vdCB0ZXN0ZWQgaW4gZW1iZWRkZWQgb3IgYW55IHNpbXVsYXRvcilcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJGaXJlZm94XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX3Njcm9sbGFibGVcIiwgW25vZGVOYW1lXSk7ICAgIFxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6XCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfcm9sZVwiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdmFsaWRfcm9sZVwiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50IGhhcyBhIHdpZGdldCByb2xlXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9yb2xlXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQncyByb2xlICd7MH0nIGlzIG5vdCBhIHdpZGdldCByb2xlXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdmFsaWRfcm9sZVwiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSB2YWxpZCB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgdGFiYmFibGUgZWxlbWVudCBtdXN0IGhhdmUgYSB2YWxpZCB3aWRnZXQgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgICAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpIHx8IFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGlzIHRhYmJhYmxlIGJ5IGRlZmF1bHQgd2l0aCBvciB3aXRob3V0IHRhYmluZGV4LCBsZXQgdGhlIG90aGVyIHJ1bGVzIChzdWNoIGFzIHdpZGdldF90YWJiYWJsZV9zaW5nbGUpIHRvIGhhbmRsZSBpdFxuICAgICAgICBpZiAobm9kZU5hbWUgaW4gQ29tbW9uVXRpbC50YWJUYWdNYXAgKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBDb21tb25VdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IG5vIHRhYmluZGV4IG9yIHRhYmluZGV4IDwgMFxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpIHx8IHBhcnNlSW50KHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSA8IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBlbGVtZW50cyB3aXRoIENTUyBvdmVyZmxvdzogc2Nyb2xsIG9yIGF1dG9cbiAgICAgICAgbGV0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZXNbJ292ZXJmbG93LXgnXSA9PT0gJ3Njcm9sbCcgfHwgc3R5bGVzWydvdmVyZmxvdy15J10gPT09ICdzY3JvbGwnIFxuICAgICAgICAgICAgfHwgc3R5bGVzWydvdmVyZmxvdy14J10gPT09ICdhdXRvJyB8fCBzdHlsZXNbJ292ZXJmbG93LXknXSA9PT0gJ2F1dG8nKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZWxlbWVudHMgd2hvc2Ugcm9sZXMgYWxsb3cgbm8gZGVzY2VuZGFudHMgdGhhdCBhcmUgaW50ZXJhY3RpdmUgb3Igd2l0aCBhIHRhYmluZGV4ID49IDAgXG4gICAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgYmUgaGFuZGxlZCBpbiB3aWRnZXRfdGFiYmFibGVfc2luZ2xlIGFuZCBhcmlhX2NoaWxkX3RhYmJhYmxlXG4gICAgICAgIGNvbnN0IHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkID1bXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImltZ1wiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIl07XG5cbiAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFyZW50X3JvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocGFyZW50IGFzIEVsZW1lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBwYXJlbnQgcm9sZSBpcyBpbiByb2xlc19ub19pbnRlcmFjdGl2ZV9jaGlsZFxuICAgICAgICBpZiAocm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQuaW5jbHVkZXMocGFyZW50X3JvbGUpKVxuICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFyb2xlKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fdmFsaWRfcm9sZVwiKTsgXG4gICAgICAgIC8vIGlnbm9yZSAnYXBwbGljYXRpb24nIHJvbGUgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBmb2N1c2FibGUgZWxlbWVudHMgdGhhdCBkbyBub3QgZm9sbG93IGEgc3RhbmRhcmQgaW50ZXJhY3Rpb24gcGF0dGVybiBzdXBwb3J0ZWQgYnkgYSB3aWRnZXQgcm9sZTpodHRwczovL3d3dy53My5vcmcvVFIvMjAyMy9QUi1XQUktQVJJQS0xLjItMjAyMzAzMjgvI2FwcGxpY2F0aW9uIFxuICAgICAgICBpZiAocm9sZSA9PT0gXCJhcHBsaWNhdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiB0YWJpbmRleCA+PSAwIHRvIGV4YW1pbmUgd2hldGhlciBhIHdpZGdldCByb2xlIGlzIHNldHVwIG9yIG5vdCBcbiAgICAgICAgLy8gcGFzcyBpZiBvbmUgb2YgdGhlIHJvbGVzIGlzIGEgd2lkZ2V0IHR5cGVcbiAgICAgICAgLy8gUm93IGlzIHdlaXJkLiBJdCdzIHN0cnVjdHVyZSwgYnV0IGNhbiBhbHNvIGJlIHdpZGdldFxuICAgICAgICAvLyBGb2N1c2FibGUgc2VwYXJhdG9ycyBhcmUgd2lkZ2V0c1xuICAgICAgICBpZiAocm9sZSA9PT0gXCJyb3dcIiB8fCByb2xlID09PSBcInNlcGFyYXRvclwiIHx8IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkX3JvbGVcIiwgW3JvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb2JzY3VyZWRcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gYW4gZWxlbWVudCByZWNlaXZlcyBmb2N1cywgaXQgaXMgbm90IGVudGlyZWx5IGNvdmVyZWQgYnkgb3RoZXIgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgaXMgbm90IGVudGlyZWx5IGNvdmVyZWQgYnkgb3RoZXIgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb2JzY3VyZWRcIjogXCJDb25maXJtIHRoYXQgd2hlbiB0aGUgZWxlbWVudCByZWNlaXZlcyBmb2N1cywgaXQgaXMgbm90IGNvdmVyZWQgb3IsIGlmIGNvdmVyZWQgYnkgdXNlciBhY3Rpb24sIGNhbiBiZSB1bmNvdmVyZWQgd2l0aG91dCBtb3ZpbmcgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjQuMTFcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8ICFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBjZXJ0YWluIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJwcmVcIiwgXCJjb2RlXCIsIFwic2NyaXB0XCIsIFwibWV0YVwiXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiIClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7OyAgICBcbiAgICAgICAgXG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgb2Zmc2NyZWVuXG4gICAgICAgIGlmIChib3VuZHNbJ2hlaWdodCddID09PSAwIHx8IGJvdW5kc1snd2lkdGgnXSA9PT0gMCApIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcblxuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBpZiAoY1N0eWxlID09PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHppbmRleCA9IGNTdHlsZS56SW5kZXg7ICAgXG4gICAgICAgIGlmICghemluZGV4IHx8IHppbmRleCA9PT0gJ2F1dG8nKVxuICAgICAgICAgICAgemluZGV4ID0gXCIwXCI7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ICo6bm90KHNjcmlwdCknKTtcblxuICAgICAgICBpZiAoIWVsZW1zIHx8IGVsZW1zLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgXG4gICAgICAgIGxldCB2aW9sYXRpb25zID0gW107XG4gICAgICAgIGxldCBiZWZvcmUgPSB0cnVlO1xuICAgICAgICBlbGVtcy5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiAgdGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBpcyBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgICAgICAgICogIGlmIHR3byBlbGVtZW50cyBvdmVybGFwIGFuZCB6LWluZGV4IGFyZSBub3QgZGVmaW5lZCwgdGhlbiB0aGUgbm9kZSByZW5kZXJlZCBlYXJsaWVyIHdpbGwgYmUgb3ZlcmxhaWQgYnkgdGhlIG5vZGUgcmVuZGVyZWQgbGF0ZXJcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmNvbnRhaW5zKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgLy90aGUgbmV4dCBub2RlIGluIGVsZW1zIHdpbGwgYmUgYWZ0ZXIgdGhlIHRhcmdldCBub2RlIChydWxlQ29udGV4dCkuIFxuICAgICAgICAgICAgICAgIGJlZm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbSkgJiYgIWVsZW0uY29udGFpbnMocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHpTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKGVsZW0pOyBcbiAgICAgICAgICAgICAgICBsZXQgel9pbmRleCA9ICcwJztcbiAgICAgICAgICAgICAgICBpZiAoelN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHpfaW5kZXggPSB6U3R5bGUuekluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXpfaW5kZXggfHwgaXNOYU4oTnVtYmVyKHpfaW5kZXgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHpfaW5kZXggPSBcIjBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJuZHMuaGVpZ2h0ICE9PSAwICYmIGJuZHMud2lkdGggIT09IDAgIFxuICAgICAgICAgICAgICAgICAgICAmJiBibmRzLnRvcCA8PSBib3VuZHMudG9wICYmIGJuZHMubGVmdCA8PSBib3VuZHMubGVmdCAmJiBibmRzLnRvcCArIGJuZHMuaGVpZ2h0ID49IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IFxuICAgICAgICAgICAgICAgICAgICAmJiBibmRzLmxlZnQgKyBibmRzLmhlaWdodCA+PSBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCBcbiAgICAgICAgICAgICAgICAgICAgJiYgKGJlZm9yZSA/IHBhcnNlSW50KHppbmRleCkgPCBwYXJzZUludCh6X2luZGV4KTogcGFyc2VJbnQoemluZGV4KSA8PSBwYXJzZUludCh6X2luZGV4KSkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goZWxlbSk7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gIFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGlmICh2aW9sYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX29ic2N1cmVkXCIsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZVBvdGVudGlhbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdmlzaWJsZVwiOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSB0YWJiYWJsZSBlbGVtZW50IHNob3VsZCBiZSB2aXNpYmxlIG9uIHRoZSBzY3JlZW4gd2hlbiBpdCBoYXMga2V5Ym9hcmQgZm9jdXNcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50IGlzIHZpc2libGUgb24gdGhlIHNjcmVlblwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdmlzaWJsZVwiOiBcIkNvbmZpcm0gdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHRhYmJhYmxlIGFuZCBpZiBzbywgaXQgYmVjb21lcyB2aXNpYmxlIHdoZW4gaXQgaGFzIGtleWJvYXJkIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi40LjdcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTsgXG4gICAgICAgIGNvbnN0IG1hcHBlciA6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBkZWZpbmVkIHN0eWxlcyBvbmx5IGdpdmUgdGhlIHN0eWxlcyB0aGF0IGNoYW5nZWRcbiAgICAgICAgY29uc3QgZGVmaW5lZF9zdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBjb25zdCBvbmZvY3VzX3N0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgXCI6Zm9jdXNcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChib3VuZHNbJ2hlaWdodCddID09PSAwIHx8IGJvdW5kc1snd2lkdGgnXSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuXG4gICAgICAgIGlmIChkZWZpbmVkX3N0eWxlc1sncG9zaXRpb24nXT09PSdhYnNvbHV0ZScgJiYgZGVmaW5lZF9zdHlsZXNbJ2NsaXAnXSAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddLnJlcGxhY2VBbGwoJyAnLCAnJyk9PT0ncmVjdCgwcHgsMHB4LDBweCwwcHgpJ1xuICAgICAgICAgICAgJiYgIW9uZm9jdXNfc3R5bGVzWydjbGlwJ10pIHtcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIG5vdGUgdGhhdCBBIHVzZXIgY2FuIHNlbGVjdCBhIGNoZWNrYm94IGFuZCByYWRpbyBidXR0b24gYnkgc2VsZWN0aW5nIHRoZSBidXR0b24gb3IgdGhlIGxhYmVsIHRleHQuIFxuICAgICAgICAgICAgICogV2hlbiBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBjbGlwcGVkIHRvIDAgc2l6ZSwgaXQgaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGEga2V5Ym9hcmQgb3IgYSBzY3JlZW4gcmVhZGVyLiBcbiAgICAgICAgICAgICAqIFRoZSBydWxlIHNob3VsZCBiZSBwYXNzZWQgaWYgdGhlIGxhYmVsIHRleHQgZXhpc3RzIGFuZCB0aGUgYnV0dG9uIG9uLWZvY3VzIHN0eWxlIGlzIGRlZmluZWQgYnkgdGhlIHVzZXIsIFxuICAgICAgICAgICAgICogd2hpY2ggbGlrZWx5IGluY3VycyB0aGUgY2hhbmdlcyBvZiB0aGUgbGFiZWwgc3R5bGUuICAgXG4gICAgICAgICAgICAgKi8gXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndHlwZScpPT09J2NoZWNrYm94JyB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKT09PSdyYWRpbycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzX3N0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgXCI6Zm9jdXNcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzX3Zpc2libGVfc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1cy12aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c193aXRoaW5fc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1cy13aXRoaW5cIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRfc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpjaGVja2VkXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzX3N0eWxlcyB8fCBmb2N1c192aXNpYmxlX3N0eWxlcyB8fCBmb2N1c193aXRoaW5fc3R5bGVzIHx8IGNoZWNrZWRfc3R5bGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICB9ICAgICBcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfSAgICBcblxuICAgICAgICBpZiAoYm91bmRzWyd0b3AnXSA+PSAwICYmIGJvdW5kc1snbGVmdCddID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVmYXVsdF9zdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b3AgPSBib3VuZHNbJ3RvcCddO1xuICAgICAgICBsZXQgbGVmdCA9IGJvdW5kc1snbGVmdCddOyAgICAgXG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganMgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHsgICBcbiAgICAgICAgICAgIC8vIHdpdGggb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2VcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ107XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWyd0b3AnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBvbmZvY3VzX3N0eWxlc1sndG9wJ10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gaXMgdW5kZWZpbmVkIGFuZCB0aGUgcGFyZW50J3MgcG9zaXRpb24gaXMgJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ2xlZnQnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gb25mb2N1c19zdHlsZXNbJ2xlZnQnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtYmVkX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSA8ZW1iZWQ+IGVsZW1lbnQgaGFzIGFsdGVybmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgZm9yIDxlbWJlZD4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBlbWJlZF9ub2VtYmVkX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlbWJlZF9ub2VtYmVkX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRW1iZWRfSGFzTm9FbWJlZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbWJlZF9ub2VtYmVkX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtYmVkX25vZW1iZWRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgPGVtYmVkPiBlbGVtZW50IGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbm9uLWVtYmVkZGVkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8ZW1iZWQ+IGVsZW1lbnRzIHNob3VsZCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1lbWJlZGRlZCBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJub2VtYmVkXCIpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5uZXh0U2libGluZztcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJub2VtYmVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZW1vdGljb25zX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1vdGljb25zX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGV4dF9FbW90aWNvbnNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgZW1vdGljb25zIGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRW1vdGljb25zIG11c3QgaGF2ZSBhIHNob3J0IHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBkZXNjcmliZXMgdGhlaXIgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIERlY2lzaW9uIGluIHBsYW5uaW5nIDkvNy8yMyB0aGF0IHRoaXMgcnVsZSBjYXVzZXMgbW9yZSByZXZpZXdzIHRoYXQgd2Ugc2VlIGFjdHVhbCBwcm9ibGVtcyBpbiBjb250ZW50LCBzbyB0dXJuIHRoZXNlIHJ1bGVzIG9mZlxuICAgIFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgICovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBlbW90aWNvbnM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wiOi0pXCIsIFwiOilcIiwgXCI6bylcIiwgXCI6XVwiLCBcIjozXCIsIFwiOmMpXCIsIFwiOj5cIiwgXCI9XVwiLCBcIjgpXCIsIFwiPSlcIiwgXCI6RFwiLCBcIkM6XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiOi1EXCIsIFwiOkRcIiwgXCI4RFwiLCBcIlhEXCIsIFwiPURcIiwgXCI9M1wiLCBcIjw9M1wiLCBcIjw9OFwiLCBcIi0tIS0tXCIsIFwiOi0oXCIsIFwiOihcIiwgXCI6Y1wiLCBcIjo8XCIsIFwiOltcIixcbiAgICAgICAgICAgICAgICAgICAgXCJEOlwiLCBcIkQ4XCIsIFwiRDtcIiwgXCJEPVwiLCBcIkRYXCIsIFwidi52XCIsIFwiOi05XCIsIFwiOy0pXCIsIFwiOylcIiwgXCIqKVwiLCBcIjtdXCIsIFwiO0RcIiwgXCI6LVBcIiwgXCI6UFwiLFxuICAgICAgICAgICAgICAgICAgICBcIjotcFwiLCBcIjpwXCIsIFwiPXBcIiwgXCI6LcOeXCIsIFwiOsOeXCIsIFwiOi1iXCIsIFwiOmJcIiwgXCI6LU9cIiwgXCI6T1wiLCBcIk9fT1wiLCBcIm9fb1wiLCBcIjhPXCIsIFwiT3dPXCIsIFwiTy1PXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiMF9vXCIsIFwiT19vXCIsIFwiTzNPXCIsIFwibzBvwqA7b19vO1wiLCBcIm8uLi5vXCIsIFwiMHcwXCIsIFwiOi0vXCIsIFwiOi9cIiwgXCI6XFxcXFwiLCBcIj0vXCIsIFwiPVxcXFxcIiwgXCI6U1wiLCBcIjp8XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZDotKVwiLCBcInFCLSlcIiwgXCI6KX5cIiwgXCI6LSk+Li4uLlwiLCBcIjotWFwiLCBcIjpYXCIsIFwiOi0jXCIsIFwiOiNcIiwgXCJPOi0pXCIsIFwiMDozXCIsIFwiTzopXCIsIFwiOicoXCIsIFwiOyooXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiVF9UXCIsIFwiVFRfVFRcIiwgXCJULlRcIiwgXCI6LSpcIiwgXCI6KlwiLCBcIl5vKVwiLCBcIj46KVwiLCBcIj47KVwiLCBcIj46LSlcIiwgXCJCKVwiLCBcIkItKVwiLCBcIjgpXCIsIFwiOC0pXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiXj4uPl5cIiwgXCJePC48XlwiLCBcIl4+Xz5eXCIsIFwiXjxfPF5cIiwgXCJEOjxcIiwgXCI+OihcIiwgXCJELTo8XCIsIFwiPjotKFwiLCBcIjotQFsxXVwiLCBcIjsoXCIsIFwiYF/CtFwiLCBcIkQ8XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiPDNcIiwgXCI8MzMzXCIsIFwiPV5fXj1cIiwgXCI9Pi4+PVwiLCBcIj08Xzw9XCIsIFwiPT4uPD1cIiwgXCJcXFxcLCwvXCIsIFwiXFxcXG0vXCIsIFwiXFxcXG0vXFxcXD4uPC9cXFxcbS9cIiwgXCJcXFxcby9cIiwgXCJcXFxcbyBvL1wiLFxuICAgICAgICAgICAgICAgICAgICBcIm8vXFxcXG9cIiwgXCI6JlwiLCBcIjp1XCJcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBlbW90aWNvbnMgPSB2YWxpZGF0ZVBhcmFtcy5lbW90aWNvbnMudmFsdWU7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgdGVzdFRleHQgPSBcIlwiO1xuXG4gICAgICAgIGxldCB3YWxrTm9kZTogTm9kZSA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgIHRlc3RUZXh0ICs9IFwiIFwiICsgd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ZXN0VGV4dC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IHBhc3NlZCAmJiBqIDwgZW1vdGljb25zLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVtb3RJZHggPSB0ZXN0VGV4dC5pbmRleE9mKGVtb3RpY29uc1tqXSk7XG4gICAgICAgICAgICAgICAgbGV0IGVMbmd0aCA9IGVtb3RpY29uc1tqXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiBlbW90SWR4ICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhc3NlcyBpZjogdGhlIGVtb3RpY29uIGlzIG5vdCBwcmVjZWRlZCBieSB3aGl0ZXNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGUgZW1vdGljb24gaXMgbm90IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UgdW5sZXNzIGl0J3MgcHVuY3R1YXRpb24sXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIGl0J3MgaW4gYSBwcmUsIGNvZGUsIG9yIHNjcmlwdFxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKGVtb3RJZHggPiAwICYmICEvXFxzLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4IC0gMSwgZW1vdElkeCkpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVtb3RJZHggPCB0ZXN0VGV4dC5sZW5ndGggLSBlTG5ndGggJiYgIS9cXHMvLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggKyBlTG5ndGgsIGVtb3RJZHggKyBlTG5ndGggKyAxKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhL1suLCEnXCI/XS8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCArIGVMbmd0aCwgZW1vdElkeCArIGVMbmd0aCArIDEpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgdXNhZ2Ugb2YgKDogc3R1ZmYgOikgc2luY2UgdGhpcyBpcyBhIGNvbW1lbnQgaW4gc29tZSBsYW5ndWFnZXNcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8ICgoZW1vdGljb25zW2pdID09IFwiOilcIiB8fCBlbW90aWNvbnNbal0gPT0gXCIoOlwiKSAmJiAvXFwoXFw6LipcXDpcXCkvLnRlc3QodGVzdFRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8ICgoZW1vdGljb25zW2pdID09IFwiOylcIiB8fCBlbW90aWNvbnNbal0gPT0gXCIoO1wiKSAmJiAvXFwoXFw7LipcXDtcXCkvLnRlc3QodGVzdFRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgZW1vdElkeCA9IHRlc3RUZXh0LmluZGV4T2YoZW1vdGljb25zW2pdLCBlbW90SWR4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0LCBwcmUsIGNvZGVcbiAgICAgICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcImJvZHlcIl0pO1xuICAgICAgICAgICAgcGFzc2VkID0gY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVycm9yX21lc3NhZ2VfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWludmFsaWQ9dHJ1ZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXJpYV9FcnJvck1lc3NhZ2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkN1c3RvbSBlcnJvciBtZXNzYWdlIGhhcyBpbnZhbGlkIHJlZmVyZW5jZSAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkN1c3RvbSBlcnJvciBtZXNzYWdlIGlzIG5vdCB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBtdXN0IHJlZmVyZW5jZSBhIHZhbGlkICdpZCcgdmFsdWUgYW5kIHdoZW4gdHJpZ2dlcmVkIHRoZSBtZXNzYWdlIG11c3QgYmUgYXBwcm9wcmlhdGVseSBleHBvc2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYXJpYV9lcnJNc2dJZCA9IEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIik7XG5cbiAgICAgICAgLy8gSWYgYXJpYS1lcnJvcm1lc3NhZ2UgaXMgbm90IHByb3ZpZGVkLCB0aGVuIE9VVF9PRl9TQ09QRVxuICAgICAgICBpZiAoIWFyaWFfZXJyTXNnSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1zZ19lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgYXJpYV9lcnJNc2dJZCk7XG5cbiAgICAgICAgLy8gUE9GMDogSW52YWxpZCBpZCByZWZlcmVuY2VcbiAgICAgICAgaWYgKCFtc2dfZWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQT0YxOiBSZWZlcmVuY2VkIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUobXNnX2VsZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWVsZHNldF9sYWJlbF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJmaWVsZHNldF9sYWJlbF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpncm91cFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiZ3JvdXBfd2l0aElucHV0c19oYXNOYW1lXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiUGFzc18xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJHcm91cC9GaWVsZHNldCBcXFwiezB9XFxcIiB3aXRoIGFuIGlucHV0IGhhcyBhIHVuaXF1ZSBuYW1lXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkdyb3VwL0ZpZWxkc2V0IGRvZXMgbm90IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkdyb3VwL0ZpZWxkc2V0IFxcXCJ7MH1cXFwiIGhhcyBhIGR1cGxpY2F0ZSBuYW1lIHRvIGFub3RoZXIgZ3JvdXBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgd2l0aCBuZXN0ZWQgaW5wdXRzIG11c3QgaGF2ZSB1bmlxdWUgYWNjZXNzaWJsZSBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCIsIFwiMy4zLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IG93bmVyRG9jdW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBmb3JtQ2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJsYW5kbWFya19ncm91cF9pbnB1dFwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBncm91cHNXaXRoSW5wdXRzOiBbXSxcbiAgICAgICAgICAgICAgICBncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHM6IFtdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBhbGxHcm91cHNUZW1wID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICdmaWVsZHNldCxbcm9sZT1cImdyb3VwXCJdJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBhbGxHcm91cHMgPSBBcnJheS5mcm9tKGFsbEdyb3Vwc1RlbXApO1xuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsR3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgZ3JvdXAgbm9kZXNcbiAgICAgICAgICAgICAgICBpZiAoYWxsR3JvdXBzW2ldLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBncm91cHNXaXRoSW5wdXRzLnB1c2goYWxsR3JvdXBzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3Vwc1dpdGhJbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGdyb3Vwc1dpdGhJbnB1dHNbaV0pO1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC8qKkFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZ3JvdXBzV2l0aElucHV0c1tpXSkqL1xuICAgICAgICAgICAgICAgICAgICBwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDAgPyBwYWlyLm5hbWUudHJpbSgpIDogXCJcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cyA9IGdyb3Vwc1dpdGhJbnB1dHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzID1cbiAgICAgICAgICAgICAgICBncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHM7XG5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImxhbmRtYXJrX2dyb3VwX2lucHV0XCIsZm9ybUNhY2hlKTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHM6IFwiICtlbGVtZW50LmlkKVxuICAgICAgICAvLyB9KTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBcIiArZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscylcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBcIiArZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5sZW5ndGgpXG5cbiAgICAgICAgbGV0IHJ1bGVDb250ZXh0Rm91bmRJbmdyb3Vwc1dpdGhJbnB1dHNGbGFnID0gZmFsc2U7XG4gICAgICAgIGxldCBjb21wdXRlZE5hbWUgPSBcIlwiO1xuICAgICAgICBpZiAoIWZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzKSB7XG4gICAgICAgICAgICAvLyBXZSBkbyBub3QgaGF2ZSBhbnkgZ3JvdXBzIHdpdGggaW5wdXRzLiBUaGVyZWZvcmUgd2Ugc2hvdWxkIHNraXAgdGhpcyBydWxlIHRyaWdnZXIuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pc1NhbWVOb2RlKGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzW2ldKSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgZm91bmQgb3VyIHJ1bGVDb250ZXh0IGluIHRoZSBjYWNoZVxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Rm91bmRJbmdyb3Vwc1dpdGhJbnB1dHNGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZhaWxfMVwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBmb3VuZFNhbWVOYW1lRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaiA8IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBqKytcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGFyZSBhZ2FpbnN0IG91cnNlbGZzXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTYW1lTmFtZUZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFNhbWVOYW1lRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZhaWxfMlwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXB1dGVkTmFtZSA9IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJudWxsIHJldHVyblwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJQYXNzXzFcIilcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xXCIsIFtjb21wdXRlZE5hbWVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZpZWxkc2V0X2xlZ2VuZF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpmaWVsZHNldFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ZpZWxkc2V0X0hhc0xlZ2VuZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmaWVsZHNldF9sZWdlbmRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIDxsZWdlbmQ+XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIjxmaWVsZHNldD4gZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSA8bGVnZW5kPlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgPGxlZ2VuZD4gaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCIgPGZpZWxkc2V0PiBlbGVtZW50cyBzaG91bGQgaGF2ZSBhIHNpbmdsZSwgbm9uLWVtcHR5IDxsZWdlbmQ+IGFzIGEgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLCAgLy9odHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMi9UZWNobmlxdWVzL2h0bWwvSDcxXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgIC8vc2tpcCBpZiB0aGUgZmllbGRzZXQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBhIGxlZ2VuZCBpcyBoaWRkZW4sIHdlIHNob3VsZCBzdGlsbCB0cmlnZ2VyIGEgdmlvbGF0aW9ucyBmb3IgdGhpc1xuICAgICAgICBsZXQgbGVnZW5kcyA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJsZWdlbmRcIiwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICBpZiAobGVnZW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEZpZWxkc2V0IGhhcyBOTyBMZWdlbmRcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChsZWdlbmRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIEZpZWxkc2V0IGhhcyBtb3JlIHRoYW4gb25lIGxlZ2VuZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGxlZ2VuZHNbMF0pLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIEZpZWxkc2V0IGhhcyBsZWdlbmQgYnV0IGxlZ2VuZCBpcyBlbXB0eVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZpZ3VyZV9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmlndXJlX2xhYmVsX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZpZ3VyZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19GaWd1cmVfbGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmaWd1cmVfbGFiZWxfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ZmlndXJlPiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGZpZ3VyZT4gZWxlbWVudCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZC4gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiB0aGUgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2xldCBwYXNzZWQgPSBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBjb25zdCBwYXNzZWQgPSBwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtX2ZvbnRfY29sb3I6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9mb250X2NvbG9yXCIsXG4gICAgY29udGV4dDogXCJkb206Zm9ybVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ZvbnRfQ29sb3JJbkZvcm1cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgY29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIHRvIGNvbnZleSB3aGljaCBmaWVsZHMgYXJlIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tYmluZSBjb2xvciBhbmQgZGVzY3JpcHRpdmUgbWFya3VwIHRvIGluZGljYXRlIHJlcXVpcmVkIGZvcm0gZmllbGRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGZvbnRzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJmb250XCIpO1xuICAgICAgICBpZiAoZm9udHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFmb250c1tpXS5oYXNBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpmb3JtW3RhcmdldF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX1RhcmdldEFuZFRleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgaW50ZXJhY3Rpbmcgd2l0aCBjb250ZW50IHdpbGwgbm90IG9wZW4gcG9wLXVwIHdpbmRvd3Mgb3IgY2hhbmdlIHRoZSBhY3RpdmUgd2luZG93IHdpdGhvdXQgaW5mb3JtaW5nIHRoZSB1c2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlciBzaG91bGQgYmUgaW5mb3JtZWQgaW4gYWR2YW5jZSB3aGVuIGludGVyYWN0aW5nIHdpdGggY29udGVudCBjYXVzZXMgYSBjaGFuZ2Ugb2YgY29udGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PT0gXCJfcGFyZW50XCIgfHwgdFN0ciA9PT0gXCJfc2VsZlwiIHx8IHRTdHIgPT09IFwiX3RvcFwiIHx8IENvbW1vblV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsIHRTdHIpICE9IG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBOYW1lIGlzIG5vdCBwYXJ0IG9mIHRoaXMgZnJhbWVzZXQg4oCTIG11c3QgaGF2ZSBwb3RlbnRpYWwgdG8gY3JlYXRlIG5ldyB3aW5kb3c/XG4gICAgICAgICAgICAvLyBTZWUgaWYgYSBuZXcgd2luZG93IGlzIG1lbnRpb25lZFxuICAgICAgICAgICAgbGV0IHRleHRTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikpXG4gICAgICAgICAgICAgICAgdGV4dFN0ciArPSBcIiBcIiArIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHZhbGlkYXRlUGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBpZiAodGV4dFN0ci5pbmRleE9mKHZhbGlkYXRlUGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZVtpXSkgIT0gLTEpIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJmb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmxhYmVsW2Zvcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MYWJlbF9VbmlxdWVGb3JcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBoYXMgbW9yZSB0aGFuIG9uZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZvcm0gY29udHJvbHMgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBsZXQgbGFiZWxJZHMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpLCBcIlJQVF9MYWJlbF9TaW5nbGVcIiwge30pXG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICEoaWQgaW4gbGFiZWxJZHMpO1xuICAgICAgICBsYWJlbElkc1tpZF0gPSB0cnVlO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Zm9ybVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0Zvcm1fSGFzU3VibWl0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGUgPGZvcm0+IGVsZW1lbnQgaGFzIGEgc3VibWl0IGJ1dHRvbiBvciBhbiBpbWFnZSBidXR0b25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmb3JtPiBlbGVtZW50IHNob3VsZCBoYXZlIGEgc3VibWl0IGJ1dHRvbiBvciBhbiBpbWFnZSBidXR0b25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gc3VibWl0IGJ1dHRvbnMgYXJlIHVzdWFsbHkgYXQgdGhlIGJvdHRvbSAtIHdhbGsgYmFja3dhcmRzXG4gICAgICAgICAgICAvL2xldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFudy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eXBlID09PSBcInN1Ym1pdFwiIHx8IHR5cGUgPT09IFwiaW1hZ2VcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9zdWJtaXRfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fc3VibWl0X3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFtvbmNoYW5nZV0sIGRvbTppbnB1dFtvbmNoYW5nZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb3JtX0NoYW5nZUVtcHR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNvbmZpcm0gdGhlIGZvcm0gZG9lcyBub3Qgc3VibWl0IGF1dG9tYXRpY2FsbHkgd2l0aG91dCB3YXJuaW5nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBmb3JtIHNob3VsZCBub3QgYmUgc3VibWl0dGVkIGF1dG9tYXRpY2FsbHkgd2l0aG91dCB3YXJuaW5nIHRoZSB1c2VyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sKi9cbiAgICAvL2RlcHJlY2F0ZSB0aGUgcnVsZSBvbiBKdW4gMTAsIDIwMjRcbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25jaGFuZ2VcIikudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZyYW1lX3NyY192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJmcmFtZV9zcmNfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpmcmFtZSwgZG9tOmlmcmFtZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9GcmFtZV9TcmNIdG1sXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgPGZyYW1lPiBjb250ZW50IGlzIGFjY2Vzc2libGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmcmFtZT4gY29udGFpbmluZyBub24tSFRNTCBjb250ZW50IG11c3QgYmUgbWFkZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInNyY1wiKSAmJlxuICAgICAgICAgICAgQ29tbW9uVXRpbC5pc0h0bWxFeHQoQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKSkpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmcmFtZV90aXRsZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZnJhbWVfdGl0bGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206ZnJhbWUsIGRvbTppZnJhbWVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9GcmFtZV9IYXNUaXRsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImZyYW1lX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZyYW1lX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZyYW1lX3RpdGxlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW5saW5lIGZyYW1lcyBtdXN0IGhhdmUgYSB1bmlxdWUsIG5vbi1lbXB0eSAndGl0bGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbmxpbmUgZnJhbWUgZG9lcyBub3QgaGF2ZSBhICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIC8qQ2hhbmdlIG1hcHBpbmcgdG8gNC4xLjIgZnJvbSAyLjQuMSB0eXBvPyAqL1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogXCJjYWU3NjBcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQuIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKG5hbWVfcGFpciAmJiBuYW1lX3BhaXIubmFtZSAmJiBuYW1lX3BhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAvL2lmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBoZWFkaW5nX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImhlYWRpbmdfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpoMSwgZG9tOmgyLCBkb206aDMsIGRvbTpoNCwgZG9tOmg1LCBkb206aDZcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9IZWFkZXJfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiSGVhZGluZyBlbGVtZW50IGhhcyBkZXNjcmlwdGl2ZSB0ZXh0XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkhlYWRpbmcgZWxlbWVudCBoYXMgbm8gZGVzY3JpcHRpdmUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhlYWRpbmcgZWxlbWVudHMgbXVzdCBwcm92aWRlIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC42XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9Q29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaGVhZGluZ19tYXJrdXBfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmgxLCBkb206aDIsIGRvbTpoMywgZG9tOmg0LCBkb206aDUsIGRvbTpoNlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiaGVhZGluZ19jb250ZW50X2V4aXN0c1wiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9IZWFkZXJzX0Zld1dvcmRzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBoZWFkaW5nIGVsZW1lbnQgaXMgYSBnZW51aW5lIGhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIGVsZW1lbnRzIG11c3Qgbm90IGJlIHVzZWQgZm9yIHByZXNlbnRhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBoZWFkaW5nTGVuZ3RoVGhyZXNoOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDIwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGhlYWRpbmdMZW5ndGhUaHJlc2ggPSB2YWxpZGF0ZVBhcmFtcy5oZWFkaW5nTGVuZ3RoVGhyZXNoLnZhbHVlO1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpKSA8PSBoZWFkaW5nTGVuZ3RoVGhyZXNoO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5pbXBvcnQgeyBMYW5nVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nXCI7XG5cbmV4cG9ydCBjb25zdCBodG1sX2xhbmdfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImh0bWxfbGFuZ19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSHRtbF9IYXNMYW5nXCI6IHsgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJGYWlsXzRcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiRmFpbF81XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiUG90ZW50aWFsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogXCJQb3RlbnRpYWxfNlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2UgbXVzdCBpZGVudGlmeSB0aGUgZGVmYXVsdCBsYW5ndWFnZSBvZiB0aGUgZG9jdW1lbnQgd2l0aCBhICdsYW5nJyBhdHRyaWJ1dGVcIiwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhZ2UgbGFuZ3VhZ2UgZGV0ZWN0ZWQgYXMgXFxcInswfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiUGFnZSBkZXRlY3RlZCBhcyBYSFRNTCAxLjAsIGJ1dCBoYXMgbmVpdGhlciAnbGFuZycgbm9yICd4bWw6bGFuZycgYXR0cmlidXRlc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MLCBidXQgZG9lcyBub3QgaGF2ZSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJQYWdlIGRldGVjdGVkIGFzIEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJQYWdlIGRldGVjdGVkIHdpdGggJ2xhbmcnIGFuZCAneG1sOmxhbmcnIGF0dHJpYnV0ZXMgYW5kIHByaW1hcnkgbGFuZ3VhZ2VzIGRvIG5vdCBtYXRjaDogXFxcInswfVxcXCIsIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfNVwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCBtYXRjaDogXFxcInswfVxcXCIsIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiUGFnZSBkZXRlY3RlZCBhcyBYSFRNTCAxLjAgd2l0aCBvbmx5IGEgJ2xhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHRleHQvaHRtbCBtaW1lIHR5cGVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYW4gJ3htbDpsYW5nJyBhdHRyaWJ1dGUuIENvbmZpcm0gdGhhdCBwYWdlIGlzIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMy4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiYjVjM2Y4XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiNWI3YWUwXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfNVwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNQcmVzZW50YXRpb25GcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZG9jdHlwZVN0cmluZyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdHlwZSA/IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdHlwZS5wdWJsaWNJZCA6IFwiXCI7XG4gICAgICAgIGlmICghZG9jdHlwZVN0cmluZykgZG9jdHlwZVN0cmluZyA9IFwiXCI7XG4gICAgICAgIGxldCBsYW5nID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKTtcbiAgICAgICAgbGV0IGxhbmdYTUwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKTtcblxuICAgICAgICBpZiAoZG9jdHlwZVN0cmluZy5pbmNsdWRlcygnWEhUTUwnKSAmJiAhZG9jdHlwZVN0cmluZy5pbmNsdWRlcyhcIjEuMFwiKSkge1xuICAgICAgICAgICAgaWYgKCFsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgIT0gMS4wIChtdXN0IGhhdmUgeG1sOmxhbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLFtsYW5nWE1MXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jdHlwZVN0cmluZy5pbmNsdWRlcygnWEhUTUwnKSAmJiBkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgWEhUTUwgMS4wXG4gICAgICAgICAgICAvLyBJZiBuZWl0aGVyIGlzIHByb3ZpZGVkLCBpdCdzIGEgZmFpbHVyZVxuICAgICAgICAgICAgaWYgKCFsYW5nICYmICFsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG5vIGxhbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZykge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IGxhbmcgKG9rYXkgaWYgb25seSBkZWxpdmVyZWQgdmlhIHRleHQvaHRtbClcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF81XCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgb25seSB4bWw6bGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgeG1sIG1pbWUgdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF82XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFsYW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nICYmIGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBIVE1MNSBwb2x5Z2xvdCBkb2N1bWVudHNcbiAgICAgICAgICAgICAgICBpZiAobGFuZyAhPT0gbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLnZhbGlkUHJpbWFyeUxhbmcobGFuZykgfHwgIUxhbmdVdGlsLnZhbGlkUHJpbWFyeUxhbmcobGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCBFbGVtX0xhbmdfVmFsaWQgaGFuZGxlIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwubWF0Y2hQcmltYXJ5TGFuZyhsYW5nLCBsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIGxhbmcgYW5kIHhtbDpsYW5nLCBidXQgdGhleSBkb24ndCBtYXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF80XCIsIFtsYW5nLCBsYW5nWE1MXSwgW10pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF81XCIsIFtsYW5nLCBsYW5nWE1MXSwgW10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIGxhbmcgYW5kIHhtbDpsYW5nIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLFtsYW5nXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLFtsYW5nXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuICAgIFxuZXhwb3J0IGNvbnN0IGh0bWxfc2tpcG5hdl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9za2lwbmF2X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9IdG1sX1NraXBOYXZcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBodG1sX3NraXBuYXZfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBodG1sX3NraXBuYXZfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlByb3ZpZGUgYSB3YXkgdG8gYnlwYXNzIGJsb2NrcyBvZiBjb250ZW50IHRoYXQgYXJlIHJlcGVhdGVkIG9uIG11bHRpcGxlIFdlYiBwYWdlc1wiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGVyZSBpcyBhIHdheSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMi40LjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgZnJhbWVzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImZyYW1lXCIpO1xuICAgICAgICBsZXQgaGVhZGVycyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJoMVwiKTtcblxuICAgICAgICBpZiAoKGZyYW1lcyAhPSBudWxsICYmIGZyYW1lcy5sZW5ndGggPiAwKSB8fCAoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIC8vIElmIGZyYW1lcyBvciBoZWFkaW5ncyBhcmUgdXNlZCwgcGFzc1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExvb2sgZm9yIHNraXAgYW5jaG9yc1xuICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiYVwiKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXRzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyAhcGFzc2VkICYmIGlkeCA8IGFuY2hvcnMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3JzW2lkeF0uaGFzQXR0cmlidXRlKFwiaHJlZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IGFuY2hvcnNbaWR4XS5ocmVmO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhyZWYgIT09IHR5cGVvZiBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHJlZi5iYXNlVmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZiA9IGhyZWYuYmFzZVZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZiA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRtcExvY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICgocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCBhcyBhbnkpLmxvY2F0aW9uRnJvbURBUCkgIT0gXCJ1bmRlZmluZWRcIiAmJiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCBhcyBhbnkpLmxvY2F0aW9uRnJvbURBUCAhPSBudWxsKSB7IC8vIERBUCBzZXRzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICB0bXBMb2NhdGlvbiA9IChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBzZXJ2ZXIgc2NhbiBoYXMgdGhlIGxvY2F0aW9uIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wTG9jYXRpb24gPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmxvY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb2NIcmVmID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRtcExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NIcmVmID0gdG1wTG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGaXggd2VpcmQgYnVncyB3aXRoIGhvdyB2YXJpb3VzIHBhcnNlcnMgcmVwb3J0IG9uIGZpbGU6IHVybCdzOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaHJlZi5zdGFydHNXaXRoKFwiZmlsZTovLy9cIikpIGhyZWYgPSBcImZpbGU6L1wiICsgaHJlZi5zdWJzdHJpbmcoXCJmaWxlOi8vL1wiLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2NIcmVmLnN0YXJ0c1dpdGgoXCJmaWxlOi8vL1wiKSkgZG9jSHJlZiA9IFwiZmlsZTovXCIgKyBkb2NIcmVmLnN1YnN0cmluZyhcImZpbGU6Ly8vXCIubGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaHJlZi5jaGFyQXQoMCkgPT0gXCIjXCIgfHwgaHJlZi5zdGFydHNXaXRoKGRvY0hyZWYgKyBcIiNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBDb21tb25VdGlsLmdldEZpbGVBbmNob3IoaHJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHRhcmdldCkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHNbdGFyZ2V0XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuY2hvcnNbaWR4XS5oYXNBdHRyaWJ1dGUoXCJuYW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBmb3J3YXJkIGp1bXBpbmcgdGFyZ2V0c1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGFuY2hvcnNbaWR4XS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKFwiI1wiKSAhPSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBDb21tb25VdGlsLmdldEZpbGVBbmNob3IobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG5hbWUgaW4gdGFyZ2V0cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcblxuZXhwb3J0IGNvbnN0IGlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppZnJhbWVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSWZyYW1lIHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBzaG91bGQgbm90IGJlIGV4Y2x1ZGVkIGZyb20gdGFiIG9yZGVyIHVzaW5nIHRhYmluZGV4XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgaWZyYW1lIHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBub3QgZXhjbHVkZWQgZnJvbSB0aGUgdGFiIG9yZGVyIHVzaW5nIHRhYmluZGV4XCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSA8aWZyYW1lPiB3aXRoIGludGVyYWN0aXZlIGNvbnRlbnQgaXMgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiYWtuN2JuXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGlmcmFtZSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAzMCB8fCBNYXRoLm1pbihib3VuZHNbJ2hlaWdodCddLCBib3VuZHNbJ3dpZHRoJ10pIDwgMTUpICBcbiAgICAgICAgICAgcmV0dXJuIG51bGw7IFxuXG4gICAgICAgIC8vIHBhc3MgaWZyYW1lIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIGEgbmVnYXRpdmUgbnVtYmVyXG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmcmFtZSBjb250ZW50XG4gICAgICAgIGNvbnN0IGlmcmFtRWxlbSA9IHJ1bGVDb250ZXh0IGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICBpZiAoIWlmcmFtRWxlbSB8fCAhaWZyYW1FbGVtLmNvbnRlbnREb2N1bWVudCB8fCAhaWZyYW1FbGVtLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudCA9IENvbW1vblV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRcIik7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltYWdlYnV0dG9uX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfRXhwbGljaXRMYWJlbEltYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIlBhc3NfMVwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJQYXNzXzJcIixcbiAgICAgICAgICAgIFwiRmFpbFwiOiBcIkZhaWxcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgdGhlICdhbHQnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJJbWFnZSBidXR0b24gcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCB1c2luZyBhbiBBUklBIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIHRoZSAndGl0bGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCBvZiB0eXBlIFxcXCJpbWFnZVxcXCIgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IG9mIHR5cGUgXFxcImltYWdlXFxcIiBzaG91bGQgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNTk3OTZmXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9XQUkvV0NBRzIyL1RlY2huaXF1ZXMvZmFpbHVyZXMvRjY1XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkgIT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18yXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWFnZW1hcF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImltYWdlbWFwX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbdXNlbWFwXSwgZG9tOmltZ1tpc21hcF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfSW1nX1VzZW1hcEFsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbWFnZW1hcF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWFnZW1hcF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW1hZ2UgbWFwIG9yIGNoaWxkIDxhcmVhPiBoYXMgbm8gdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGltYWdlIG1hcCBhbmQgZWFjaCA8YXJlYT4gZWxlbWVudCBpbiBhbiBpbWFnZSBtYXAgbXVzdCBoYXZlIHRleHQgYWx0ZXJuYXRpdmUocylcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpIHx8XG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlzbWFwXCIpICYmICFDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInVzZW1hcFwiKSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfYmFja2dyb3VuZDogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X2JhY2tncm91bmRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0JhY2tncm91bmRJbWdfSGFzVGV4dE9yVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGltcG9ydGFudCBiYWNrZ3JvdW5kIGltYWdlIGluZm9ybWF0aW9uIGhhcyBhIHRleHQgYWx0ZXJuYXRpdmUgaW4gc3lzdGVtIGhpZ2ggY29udHJhc3QgbW9kZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkJhY2tncm91bmQgaW1hZ2VzIHRoYXQgY29udmV5IGltcG9ydGFudCBpbmZvcm1hdGlvbiBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBpbWFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgc3R5bGUgPSBkb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJhY2tncm91bmRJbWdzID0gc3R5bGUuYmFja2dyb3VuZEltYWdlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoYmFja2dyb3VuZEltZ3MgIT0gbnVsbCAmJiBiYWNrZ3JvdW5kSW1ncyAhPSBcIlwiICYmIGJhY2tncm91bmRJbWdzICE9ICdub25lJyAmJiBiYWNrZ3JvdW5kSW1ncyAhPSAnaW5oZXJpdCcpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pbm5lckhUTUwgIT0gbnVsbCAmJiBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICAgICAgICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggIT0gMClcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X2RlY29yYXRpdmU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9kZWNvcmF0aXZlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfUHJlc2VudGF0aW9uSW1nSGFzTm9uTnVsbEFsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImltZ19hbHRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9kZWNvcmF0aXZlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW1hZ2UgZGVzaWduYXRlZCBhcyBkZWNvcmF0aXZlIGhhcyBub24tbnVsbCAnYWx0JyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbWFnZSBkZXNpZ25hdGVkIGFzIGRlY29yYXRpdmUgbXVzdCBoYXZlICdhbHQ9XFxcIlxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS5sZW5ndGggPT0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWcsIGRvbTphcmVhLCBkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfQWx0Q29tbW9uTWlzdXNlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIG5hbWUgc2VydmVzIGFzIGEgZ29vZCBpbmxpbmUgcmVwbGFjZW1lbnQgZm9yIHRoZSBpbWFnZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGEgZ29vZCBpbmxpbmUgcmVwbGFjZW1lbnQgZm9yIHRoZSBpbWFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBiYWRUZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInNob3J0IGRlc2NyaXB0aW9uXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIC8vIEFsdCB0ZXh0IGNoZWNrIGFyZSBlbHNld2hlcmUgKFNlZSA0MSwgMjQwLCA0NTUpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgIGxldCBhbHRUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgYmFkVGV4dCA9IHZhbGlkYXRlUGFyYW1zLmJhZFRleHQudmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgYmFkVGV4dC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBhbHRUZXh0LmluZGV4T2YoYmFkVGV4dFtpXSkgPT0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNyYyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgobm9kZU5hbWUgPT0gXCJhcmVhXCIpID8gXCJocmVmXCIgOiBcInNyY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgaXQgdG8gcGFzcyBpZiB0aGVyZSdzIG5vIHNyYyAtIGNhbid0IGRldGVybWluZSB0aGVzZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNyYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIGlmIHRoZSBhbHQgbWF0Y2hlcyB0aGUgc3JjIGV4YWN0bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gZmFpbCBpZiB0aGUgYWx0IGhhcyBhIC4gaW4gaXQgYW5kIGVpdGhlciB0aGUgc3JjIGlzIGluIHRoZSBhbHQgb3IgdGhlIGFsdCBpcyBpbiB0aGUgc3JjXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBzcmMudHJpbSgpICE9IGFsdFRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWx0VGV4dC5pbmRleE9mKFwiLlwiKSA9PSAtMSB8fCAoYWx0VGV4dC5pbmRleE9mKHNyYykgPT0gLTEgJiYgc3JjLmluZGV4T2YoYWx0VGV4dCkgPT0gLTEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X251bGw6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF9udWxsXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfVGl0bGVFbXB0eVdoZW5BbHROdWxsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2RlY29yYXRpdmVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2RlY29yYXRpdmVcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiOiBcImltZ19hbHRfbnVsbC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIk5laXRoZXIgJ2FyaWEnIG5vciAndGl0bGUnIGF0dHJpYnV0ZXMgYXJlIHVzZWQgZm9yIHRoZSBkZWNvcmF0aXZlIGltYWdlXCIsXG4gICAgICAgICAgICBcImZhaWxfZGVjb3JhdGl2ZVwiOiBcIlRoZSBpbWFnZSAnYWx0JyBhdHRyaWJ1dGUgaXMgZW1wdHksIGJ1dCB0aGUgJ3RpdGxlJyBhdHRyaWJ1dGUgaXMgbm90IGVtcHR5XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCI6IFwiVGhlIGltYWdlICdhbHQnIGF0dHJpYnV0ZSBpcyBlbXB0eSwgYnV0IHRoZSAnYXJpYScgbGFiZWwgaXMgbm90IGVtcHR5IGFuZCBvdmVycmlkZXMgdGhlICdhbHQnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gdGhlIGludGVudCBpcyB0byBtYXJrIGFuIGltYWdlIGFzIGRlY29yYXRpdmUgd2l0aCBhbiBlbXB0eSAnYWx0JyBhdHRyaWJ1dGUsIHRoZSAnYXJpYScgb3IgJ3RpdGxlJyBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgdXNlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcImZhaWxfZGVjb3JhdGl2ZVwiXVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIl1cbiAgICB9XG4gICAgXSxcbiAgICBhY3Q6IFt7XCI0NmNhN2ZcIjoge1wicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIjogXCJmYWlsXCJ9fV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIGEgdGl0bGUsIGJ1dCBhbHQgaXMgZW1wdHlcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2RlY29yYXRpdmVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW1nX0xpbmtUZXh0Tm90UmVkdW5kYW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJMaW5rIHRleHQgaXMgcmVwZWF0ZWQgaW4gYW4gaW1hZ2UgJ2FsdCcgdmFsdWUgd2l0aGluIHRoZSBzYW1lIGxpbmtcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGluayB0ZXh0IG9mIHByZXZpb3VzIGxpbmsgaXMgcmVwZWF0ZWQgaW4gaW1hZ2UgJ2FsdCcgdmFsdWUgb2YgYSBsaW5rXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkltYWdlICdhbHQnIHZhbHVlIHdpdGhpbiBhIGxpbmsgaXMgcmVwZWF0ZWQgaW4gbGluayB0ZXh0IG9mIHRoZSBsaW5rIGFmdGVyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHRleHQgYWx0ZXJuYXRpdmUgZm9yIGFuIGltYWdlIHdpdGhpbiBhIGxpbmsgc2hvdWxkIG5vdCByZXBlYXQgdGhlIGxpbmsgdGV4dCBvciBhZGphY2VudCBsaW5rIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiMi40LjRcIl0sIC8vbWF0Y2ggaGVscCByZWZlcmVuY2VzXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGFOb2RlID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJhXCIpO1xuICAgICAgICAvL0lmIG5vdCBpbiBhbiBhbmNob3IsIE91dCBvZiBTY29wZVxuICAgICAgICBpZiAoYU5vZGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGFsdFRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChhbHRUZXh0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiBhbHQgdGV4dCBpcyBlbXB0eSwgdGhlcmUncyBubyB0ZXh0IHRvIGJlIHJlZHVuZGFudCAtIGxldCBhX3RleHRfcHVycG9zZVxuICAgICAgICAgICAgLy8gdHJpZ2dlciBpbiB0aGF0IGNhc2UuXG4gICAgICAgICAgICAvLyBTbyBPdXQgb2YgU2NvcGUgZm9yIHRoaXMgcnVsZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlubmVyVGV4dCA9IGFOb2RlLmlubmVyVGV4dDtcbiAgICAgICAgbGV0IGxpbmtUZXh0ID0gXCJcIjtcblxuICAgICAgICBpZiAoaW5uZXJUZXh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxpbmtUZXh0ID0gaW5uZXJUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5rVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoYWx0VGV4dCA9PSBsaW5rVGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIFRleHQgaW4gbGlua1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy9hbHQgaXMgbm9uLXplcm8sIGJ1dCBubyBsaW5rIHRleHQgLSBlbnN1cmUgYWRqYWNlbnQgbGluayB0ZXh0IGlzbid0IHJlZHVuZGFudFxuICAgICAgICAgICAgLy9sZXQgd2FsayA9IG5ldyBOb2RlV2Fsa2VyKGFOb2RlKTtcbiAgICAgICAgICAgIGxldCB3YWxrID0gbmV3IERPTVdhbGtlcihhTm9kZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKChub2RlTmFtZSA9PSBcIiN0ZXh0XCIgJiYgbm9kZS5ub2RlVmFsdWUubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKG5vZGVOYW1lID09IFwiaW1nXCIgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFsdFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBseSB3aXRoIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBTZXR0aW5nIGlmIHRoZSBhIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgb3Igbm90XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBiZWZvcmUgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dCB8fCBub2RlLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9IGFsdFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL3dhbGsgPSBuZXcgTm9kZVdhbGtlcihhTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB3YWxrID0gbmV3IERPTVdhbGtlcihhTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGsubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBhbmQgbm9kZU5hbWVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGsubm9kZTtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwiI3RleHRcIiAmJiBub2RlLm5vZGVWYWx1ZS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAobm9kZU5hbWUgPT0gXCJpbWdcIiAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGx5IHdpdGggdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaWYgdGhlIGEgZWxlbWVudCBzaG91bGQgYmUgY2hlY2tlZCBvciBub3RcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlTmFtZSA9PSBcImFcIiAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT0gYWx0VGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIFRleHQgYWZ0ZXIgaW1hZ2UgbGlua1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2FsdF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcImZhaWxfYmxhbmtfYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiZmFpbF9ub19hbHRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua190aXRsZVwiOiBcImZhaWxfYmxhbmtfdGl0bGVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hbHRcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua190aXRsZVwiOiBcImltZ19hbHRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltZ19hbHRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGltYWdlIGhhcyBhbiBhY2Nlc3NpYmxlIG5hbWUgb3IgaXMgY29ycmVjdGx5IG1hcmtlZCBhcyBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX2FsdFwiOiBcIkltYWdlICdhbHQnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiVGhlIGltYWdlIGhhcyBuZWl0aGVyIGFuIGFjY2Vzc2libGUgbmFtZSBub3IgaXMgbWFya2VkIGFzIGRlY29yYXRpdmUgb3IgcmVkdW5kYW50XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJUaGUgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhbiAnYWx0JyBhdHRyaWJ1dGUgb3IgQVJJQSBsYWJlbCwgYW5kIHRoZSAndGl0bGUnIGF0dHJpYnV0ZSB2YWx1ZSBjb25zaXN0cyBvbmx5IG9mIGJsYW5rIHNwYWNlKHMpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2VzIG11c3QgaGF2ZSBhY2Nlc3NpYmxlIG5hbWVzIHVubGVzcyB0aGV5IGFyZSBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCIyM2EyYThcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJZiBub3QgdmlzaWJsZSB0byB0aGUgc2NyZWVuIHJlYWRlciwgaWdub3JlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhcmlhIGxhYmVsXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKSA6IG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBjaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGFsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdGhlIGltZyBoYXMgbm8gYWx0IG9yIGF0dHJpYnV0ZSwgZXhhbWluZSB0aGUgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCB8fCB0aXRsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBubyB0aXRsZSBvciB0aXRsZSBpcyBlbXB0eSwgZXhhbWluZSBhbHQgZnVydGhlclxuICAgICAgICAgICAgICAgIGlmIChhbHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09ICdwcmVzZW50YXRpb24nIHx8IHJvbGUgPT09ICdub25lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FsdFwiKTtcbiAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGUgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAodGl0bGU9XCIgIFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX3RpdGxlXCIpOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGl0bGUgY29udGFpbnMgc29tZSB0ZXh0ICh0aXRsZT1cInNvbWUgdGV4dFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWx0Lmxlbmd0aCA9PT0gMCB8fCBhbHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgaW1nIGhhcyBlbXB0eSBhbHQgKGFsdD1cIlwiKSBvciBub24tZW1wdHkgYWx0IChhbHQ9XCJzb21lIHRleHRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYWx0IGNvbnRhaW5zIGJsYW5rIHNwYWNlIG9ubHkgKGFsdD1cIiBcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX2FsdFwiKTsgXG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9ICAgICAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2lzbWFwX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfaXNtYXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Vc2VtYXBWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTZXJ2ZXItc2lkZSBpbWFnZSBtYXAgaG90LXNwb3RzIGRvIG5vdCBoYXZlIGR1cGxpY2F0ZSB0ZXh0IGxpbmtzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2VydmVyLXNpZGUgaW1hZ2UgbWFwIGhvdC1zcG90cyBtdXN0IGhhdmUgZHVwbGljYXRlIHRleHQgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidXNlbWFwXCIpKSB7XG4gICAgICAgICAgICBsZXQgdXNlbWFwID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidXNlbWFwXCIpO1xuICAgICAgICAgICAgdXNlbWFwID0gdXNlbWFwLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgbGV0IGlkeCA9IHVzZW1hcC5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgIGlmIChpZHggIT0gLTEpXG4gICAgICAgICAgICAgICAgdXNlbWFwID0gdXNlbWFwLnN1YnN0cihpZHggKyAxKTtcblxuICAgICAgICAgICAgaWYgKHVzZW1hcC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwibWFwXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCBtYXBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG1hcHNbaV0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwc1tpXS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpLnRvTG93ZXJDYXNlKCkgPT0gdXNlbWFwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19sb25nZGVzY19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2xvbmdkZXNjX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1tsb25nZGVzY11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfTG9uZ0Rlc2NyaXB0aW9uMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBkZXNpZ25hdGVkIGJ5IHRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBjb250YWlucyB2YWxpZCBIVE1MIGNvbnRlbnQgKGZpbGUgZXh0ZW5zaW9uIG5vdCByZWNvZ25pemVkKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIiBUaGUgJ2xvbmdkZXNjJyBhdHRyaWJ1dGUgbXVzdCByZWZlcmVuY2UgSFRNTCBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBsb25nZGVzYyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxvbmdkZXNjXCIpO1xuICAgICAgICAvLyBpZiAobG9uZ2Rlc2MgaXMgYmFkIFVSTCkgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChsb25nZGVzYyk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBleHQubGVuZ3RoICE9IDAgJiYgQ29tbW9uVXRpbC5pc0h0bWxFeHQoZXh0KVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcIiNcIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgXCJucG0gcnVuIHByZWJ1aWxkXCIuIERvIG5vdCBlZGl0XG5cbmV4cG9ydCAqIGZyb20gXCIuL2FfdGFyZ2V0X3dhcm5pbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vYV90ZXh0X3B1cnBvc2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXBwbGV0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyZWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9iYW5uZXJfc2luZ2xlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY2hpbGRfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2dyYXBoaWNfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9oaWRkZW5fbm9udGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9pZF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9pbWdfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbWFpbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3BhcmVudF9yZXF1aXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yZWdpb25fbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yb2xlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yb2xlX3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9zZW1hbnRpY3NcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3dpZGdldF9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hc2NpaWFydF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2JsaW5rX2Nzc19yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfZWxlbV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NhcHRpb25fdHJhY2tfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9kZXNpZ25fdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kZWJ1Z19wYXRoc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9kZXRlY3Rvcl90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kaXJfYXR0cmlidXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfaWRfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbGFuZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZW1iZWRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lbWJlZF9ub2VtYmVkX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lbW90aWNvbnNfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcl9tZXNzYWdlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9maWVsZHNldF9sYWJlbF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWVsZHNldF9sZWdlbmRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZmlndXJlX2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ZvbnRfY29sb3JcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfc3JjX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZyYW1lX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9oZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfbWFya3VwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9odG1sX2xhbmdfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfc2tpcG5hdl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltYWdlYnV0dG9uX2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VtYXBfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2JhY2tncm91bmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfbnVsbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19pc21hcF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2xvbmdkZXNjX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9hdXRvY29tcGxldGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2ZpZWxkc19ncm91cGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2hhc3BvcHVwX2NvbmZsaWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2FmdGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2JlZm9yZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9vbmNoYW5nZV9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9jb250ZW50X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9uYW1lX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGFiZWxfcmVmX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3RfY2hpbGRyZW5fdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9tYXJrdXBfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3Rfc3RydWN0dXJlX3Byb3BlclwiXG5leHBvcnQgKiBmcm9tIFwiLi9tYXJxdWVlX2VsZW1fYXZvaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2JyaWVmXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYXVkaW9fdHJhbnNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfbGl2ZV9jYXB0aW9uZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfdHJhY2tfYXZhaWxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWZyZXNoX2RlbGF5XCJcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFfdmlld3BvcnRfem9vbWFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbm9lbWJlZF9jb250ZW50X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9vYmplY3RfdGV4dF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGFnZV90aXRsZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGFnZV90aXRsZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X29uY2xpY2tfYXZvaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X29uY2xpY2tfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9zZWxlY3RfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL3NlbGVjdF9vcHRpb25zX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2tpcF9tYWluX2Rlc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2NvbG9yX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV9mb2N1c192aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2hvdmVyX3BlcnNpc3RlbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N2Z19ncmFwaGljc19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2NhcHRpb25fZW1wdHlcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfY2FwdGlvbl9uZXN0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19yZWxhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2xheW91dF9saW5lYXJpemVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3Njb3BlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3N0cnVjdHVyZV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc3VtbWFyeV9yZWR1bmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2Jsb2NrX2hlYWRpbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9jb250cmFzdF9zdWZmaWNpZW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfcXVvdGVkX2NvcnJlY3RseVwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X3NlbnNvcnlfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc3BhY2luZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X3doaXRlc3BhY2VfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vd2lkZ2V0X3RhYmJhYmxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfc2luZ2xlXCIiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W2F1dG9jb21wbGV0ZV0sIGRvbTp0ZXh0YXJlYVthdXRvY29tcGxldGVdLCBkb206c2VsZWN0W2F1dG9jb21wbGV0ZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMV9JbnB1dF9BdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfaW5hcHByb3ByaWF0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsX2ludmFsaWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCI6IFwiZmFpbF9pbmNvcnJlY3RcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2luYXBwcm9wcmlhdGVcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUgaW5wdXQgZm9ybSBmaWVsZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgYW4gaW5wdXQgZm9ybSBmaWVsZCBvZiBhbnkgdHlwZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaGFzIGFuIGluY29ycmVjdCB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjczZjJjMlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBhdXRvY29tcGxldGVBdHRyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCB0b2tlbnMgPSBhdXRvY29tcGxldGVBdHRyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwIHx8IGF1dG9jb21wbGV0ZUF0dHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlID0ge1xuICAgICAgICAgICAgXCJ0b2tlbnNPbk9mZlwiOiBbXCJvblwiLCBcIm9mZlwiXSxcbiAgICAgICAgICAgIFwidG9rZW5PcHRpb25hbFNlY3Rpb25cIjogXCJzZWN0aW9uLVwiLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbFB1cnBvc2VcIjogW1wic2hpcHBpbmdcIiwgXCJiaWxsaW5nXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmRcIjogW1wibmV3LXBhc3N3b3JkXCIsIFwiY3VycmVudC1wYXNzd29yZFwiLCBcIm9uZS10aW1lLWNvZGVcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9tdWx0aWxpbmVcIjogW1wic3RyZWV0LWFkZHJlc3NcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aFwiOiBbXCJjYy1leHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljXCI6IFtcImNjLWV4cC1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX2RhdGVcIjogW1wiYmRheVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybFwiOiBbXCJ1cmxcIiwgXCJwaG90b1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX3RleHRcIjogW1wibmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwiZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJmYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwibmlja25hbWVcIixcbiAgICAgICAgICAgICAgICBcInVzZXJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDRcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDFcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnlcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwicG9zdGFsLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcImNjLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICBcInNleFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm5ldy1wYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwiY3VycmVudC1wYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uLXRpdGxlXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb25cIixcbiAgICAgICAgICAgICAgICBcInN0cmVldC1hZGRyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHBcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cC1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWNzY1wiLFxuICAgICAgICAgICAgICAgIFwiY2MtdHlwZVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tY3VycmVuY3lcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICBcImJkYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktZGF5XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LXllYXJcIixcbiAgICAgICAgICAgICAgICBcInNleFwiLFxuICAgICAgICAgICAgICAgIFwidXJsXCIsXG4gICAgICAgICAgICAgICAgXCJwaG90b1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zT3B0aW9uYWxHcm91cDJcIjogW1wiaG9tZVwiLFxuICAgICAgICAgICAgICAgIFwid29ya1wiLFxuICAgICAgICAgICAgICAgIFwibW9iaWxlXCIsXG4gICAgICAgICAgICAgICAgXCJmYXhcIixcbiAgICAgICAgICAgICAgICBcInBhZ2VyXCJdLFxuXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl90ZWxcIjogW1widGVsXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfZW1haWxcIjogW1wiZW1haWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl91cmxcIjogW1wiaW1wcFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RleHRcIjogW1widGVsLWNvdW50cnktY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLW5hdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtYXJlYS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1leHRlbnNpb25cIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGxcIjogW1widGVsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiLFxuICAgICAgICAgICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICBcImltcHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbkdyb3VwMV93ZWJhdXRoblwiOiBbXCJ3ZWJhdXRoblwiXSAgICBcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsaWRfdmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjYWNoZSlcbiAgICAgICAgICAgIHZhbGlkX3ZhbHVlcz12YWxpZF92YWx1ZXMuY29uY2F0KGNhY2hlW2tleV0pO1xuICAgICAgICBcbiAgICAgICAgbGV0IGZvdW5kTWFuZGF0b3J5VG9rZW4gPSBmYWxzZTtcbiAgICAgICAgbGV0IGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0b2tlbnMuZXZlcnkociA9PiB2YWxpZF92YWx1ZXMuaW5jbHVkZXMocikgfHwgci5zdGFydHNXaXRoKGNhY2hlWyd0b2tlbk9wdGlvbmFsU2VjdGlvbiddKSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2luY29ycmVjdFwiKTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBbXTtcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zT3B0aW9uYWxHcm91cCA9IFtdO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IG5vZGVOYW1lID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbDtcbiAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIilcbiAgICAgICAgICAgICAgICB0b2tlbnNPcHRpb25hbEdyb3VwID0gY2FjaGUudG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgdG9rZW5zT3B0aW9uYWxHcm91cCA9IGNhY2hlLnRva2Vuc09wdGlvbkdyb3VwMV93ZWJhdXRobjtcbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgdmFyaW91cyAnaW5wdXQnIHR5cGVzXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIERpc2FibGUgY2hlY2sgZm9yIGlucHV0IHR5cGU9aGlkZGVuIGZvciBub3cgYmFzZWQgb24gc2NydW0gZGlzY3Vzc2lvblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV90ZXh0LmNvbmNhdChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwYXNzd29yZFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybDtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRlbFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfdGVsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGhpcyBydWxlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhYmxlIGNoZWNrIGZvciBpbnB1dCB0eXBlPWhpZGRlbiBmb3Igbm93IGJhc2VkIG9uIHNjcnVtIGRpc2N1c3Npb25cbiAgICAgICAgbGV0IGF1dG9maWxsTWFudGxlID0gLyogKG5vZGVOYW1lPT09XCJpbnB1dFwiICYmIHR5cGU9PT1cImhpZGRlblwiKSA/IFwiYW5jaG9yXCIgOiAqLyBcImV4cGVjdGF0aW9uXCI7XG5cbiAgICAgICAgaWYgKGF1dG9maWxsTWFudGxlID09PSBcImV4cGVjdGF0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG9ufG9mZiBmb3IgZXhwZWN0YXRpb24gbWFudGxlLlxuICAgICAgICAgICAgaWYgKHRva2Vucy5pbmNsdWRlcyhcIm9uXCIpIHx8IHRva2Vucy5pbmNsdWRlcyhcIm9mZlwiKSkge1xuICAgICAgICAgICAgICAgIC8vIG9ufG9mZiBzaG91bGQgYmUgdGhlIG9ubHkgdG9rZW5cbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBkZXRhaWwgYXV0b2ZpbGwgdG9rZW5zXG4gICAgICAgIGxldCBjdXJySW5kZXggPSAwO1xuICAgICAgICBsZXQgY3VyclJlY29nbml6ZWRJbmRleCA9IDA7XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NlY3Rpb24tKicgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnNbY3VyckluZGV4XS5zdGFydHNXaXRoKGNhY2hlLnRva2VuT3B0aW9uYWxTZWN0aW9uKSAmJlxuICAgICAgICAgICAgdG9rZW5zW2N1cnJJbmRleF0ubGVuZ3RoID4gOCkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgdG9rZW5cbiAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsICdzaGlwcGluZ3xiaWxsaW5nJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiZcbiAgICAgICAgICAgIGNhY2hlLnRva2Vuc09wdGlvbmFsUHVycG9zZS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrOyAvLyBjb25zdW1lICB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKHRva2Vuc01hbmRhdG9yeUdyb3VwMS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIGZvciBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc09wdGlvbmFsR3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDFcbiAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsLmluY2x1ZGVzKHRva2Vuc1tjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4ICsgY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIHdlYmF1dGhuXG4gICAgICAgICAgICBpZiAodG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4ICsgY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4ICYmIHRva2Vuc09wdGlvbmFsR3JvdXAuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKVxuICAgICAgICAgICAgfHwgKHRva2Vucy5sZW5ndGggPiBjdXJyUmVjb2duaXplZEluZGV4ICYmIHRva2Vuc09wdGlvbmFsR3JvdXAuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwYXNzIGlmIHdlIGhhdmUgc2VlbiBlaXRoZXIgb2YgdGhlIG1hbmRhdG9yeSBncm91cHMgYW5kIGFsbCB0b2tlbnMgaGF2ZSBiZWVuIGNvbnN1bWVkXG4gICAgICAgIGlmIChmb3VuZE1hbmRhdG9yeVRva2VuICYmIHRva2Vucy5sZW5ndGggPT09IGN1cnJJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3VuZFJlY29nbml6ZWRUb2tlbiAmJiB0b2tlbnMubGVuZ3RoID09PSBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2luY29ycmVjdFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5hcHByb3ByaWF0ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbdHlwZT1yYWRpb10sIGRvbTppbnB1dFt0eXBlPWNoZWNrYm94XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X1JhZGlvQ2hrSW5GaWVsZFNldFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfTG9uZU5vZ3JvdXBcIjogXCJwYXNzX2xvbmVub2dyb3VwXCIsXG4gICAgICAgICAgICBcIlBhc3NfR3JvdXBlZFwiOiBcInBhc3NfZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJQYXNzX1JhZGlvTm9OYW1lXCI6IFwicGFzc19yYWRpb05vTmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJmYWlsX2NvbnRyb2xuYW1lbWlzbWF0Y2hcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCI6IFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiOiBcImZhaWxfbm90Z3JvdXBlZG90aGVybm90Z3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdFNhbWVHcm91cFwiOiBcImZhaWxfbm90c2FtZWdyb3VwXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Mb25lQ2hlY2tib3hcIjogXCJwb3RlbnRpYWxfbG9uZWNoZWNrYm94XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Vbm5hbWVkQ2hlY2tib3hcIjogXCJwb3RlbnRpYWxfdW5uYW1lZGNoZWNrYm94XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX2xvbmVub2dyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19ncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19yYWRpb25vbmFtZVwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVybm90Z3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90c2FtZWdyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlJlbGF0ZWQgc2V0cyBvZiByYWRpbyBidXR0b25zIG9yIGNoZWNrYm94ZXMgc2hvdWxkIGJlIHByb2dyYW1tYXRpY2FsbHkgZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJwYXNzX2xvbmVub2dyb3VwXCI6IFwiezB9IGdyb3VwaW5nIG5vdCByZXF1aXJlZCBmb3IgYSBjb250cm9sIG9mIHRoaXMgdHlwZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2dyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgZ3JvdXBlZCB3aXRoIG90aGVyIHJlbGF0ZWQgY29udHJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lXCIsXG4gICAgICAgICAgICBcInBhc3NfcmFkaW9ub25hbWVcIjogXCJSYWRpbyBpbnB1dCBpcyBub3QgZ3JvdXBlZCwgYnV0IHBhc3NlcyBiZWNhdXNlIGl0IGhhcyBubyBuYW1lIHRvIGdyb3VwIHdpdGggb3RoZXIgcmFkaW8gaW5wdXRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiOiBcInswfSBpbnB1dCBmb3VuZCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lLCBcXFwiezJ9XFxcIiBhcyBhIHsxfSBpbnB1dFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdGdyb3VwZWRvdGhlcmdyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgbm90IGluIHRoZSBncm91cCB3aXRoIGFub3RoZXIgezB9IHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCI6IFwiezB9IGlucHV0IGFuZCBvdGhlcnMgd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIiBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3RzYW1lZ3JvdXBcIjogXCJ7MH0gaW5wdXQgaXMgaW4gYSBkaWZmZXJlbnQgZ3JvdXAgdGhhbiBhbm90aGVyIHswfSB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuZ3JvdXBlZCBjaGVja2JveCBpbnB1dCBpcyBub3QgcmVsYXRlZCB0byBvdGhlciBjaGVja2JveGVzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuLW5hbWVkLCB1bmdyb3VwZWQgY2hlY2tib3ggaW5wdXQgaXMgbm90IHJlbGF0ZWQgdG8gb3RoZXIgY2hlY2tib3hlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBnZXRHcm91cCA9IChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlLCBcImZpZWxkc2V0XCIpXG4gICAgICAgICAgICAgICAgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcInJhZGlvZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JpZFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlLCBcInRhYmxlXCIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgJiYgIVRhYmxlVXRpbC5pc0RhdGFUYWJsZShyZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcyBhcmUgaW4gc2NvcGVcbiAgICAgICAgbGV0IGN0eFR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZm9ybSB3ZSdyZSBpbiAoaWYgYW55KSB0byBkZXRlcm1pbmUgb3VyIHNjb3BlXG4gICAgICAgIGxldCBjdHhGb3JtID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJmb3JtXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGFib3V0IGFsbCBvZiB0aGUgdmlzaWJsZSBjaGVja2JveGVzIGFuZCByYWRpb3MgaW4gdGhlIHNjb3BlIG9mIHRoaXMgZm9ybVxuICAgICAgICAvLyBhbmQgY2FjaGUgaXQgZm9yIGFsbCBvZiB0aGUgb3RoZXIgaW5wdXRzIGluIHRoaXMgc2NvcGVcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShjdHhGb3JtLCBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZFwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBjaGVja2JveEJ5TmFtZToge30sXG4gICAgICAgICAgICAgICAgcmFkaW9zQnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICBuYW1lVG9Hcm91cDoge1xuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBudW1DaGVja2JveGVzOiAwLFxuICAgICAgICAgICAgICAgIG51bVJhZGlvczogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgY2hlY2tib3hlcyBpbiB0aGUgZm9ybSBvciBib2R5IChidXQgbm90IG5lc3RlZCBpbiBzb21ldGhpbmcgZWxzZSBhbmQgbm90IGhpZGRlbilcbiAgICAgICAgICAgIC8vIEFuZCBnZXQgYSBtYXBwaW5nIG9mIHRoZXNlIGNoZWNrYm94ZXMgdG9cbiAgICAgICAgICAgIGxldCBjV2Fsa2VyID0gbmV3IERPTVdhbGtlcihjdHhGb3JtLCBmYWxzZSwgY3R4Rm9ybSwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgY2hlY2tib3hRID0gW107XG4gICAgICAgICAgICBsZXQgcmFkaW9zUSA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGNXYWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghY1dhbGtlci5iRW5kVGFnXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBjV2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjV2Fsa2VyLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gKGNXYWxrZXIubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFEucHVzaChjV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9zUS5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBsZXQgY2hlY2tib3hRID0gY3R4Rm9ybS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT1jaGVja2JveF1cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjaGVja2JveFEubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gY2hlY2tib3hRW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGNiLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA9PT0gY3R4Rm9ybVxuICAgICAgICAgICAgICAgICAgICAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gY2IuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdIHx8IFtdKS5wdXNoKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSByYWRpb3MgaW4gdGhlIGZvcm0gb3IgYm9keSAoYnV0IG5vdCBuZXN0ZWQgaW4gc29tZXRoaW5nIGVsc2UgYW5kIG5vdCBoaWRkZW4pXG4gICAgICAgICAgICAvLyBsZXQgcmFkaW9zUSA9IGN0eEZvcm0ucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9cmFkaW9dXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcmFkaW9zUS5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHJhZGlvc1FbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRDdHggPSAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShyLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocmFkQ3R4ID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHIuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSA9IGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSA9IGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSB8fCBnZXRHcm91cChyKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtUmFkaW9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjdHhGb3JtLCBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZFwiLCBmb3JtQ2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLyBDYWxjdWxhdGVkIGV2ZXJ5dGhpbmcsIG5vdyBjaGVjayB0aGUgdmFyaW91cyBjYXNlc1xuXG4gICAgICAgIGNvbnN0IGN0eE5hbWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO1xuICAgICAgICBjb25zdCBjdHhHcm91cCA9IGdldEdyb3VwKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY3R4VHlwZSA9IGN0eFR5cGUgPT09IFwicmFkaW9cIiA/IFwiUmFkaW9cIiA6IFwiQ2hlY2tib3hcIjtcblxuICAgICAgICBpZiAoIWN0eE5hbWUgfHwgY3R4TmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gRmlyc3QgcHJvY2VzcyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCBpcyBub3QgbmFtZWRcbiAgICAgICAgICAgIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBSYWRpb3Mgd2l0aG91dCBuYW1lcyBkb24ndCBhY3QgbGlrZSBncm91cHMsIHNvIGRvbid0IGVuZm9yY2UgZ3JvdXBpbmdcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19yYWRpb25vbmFtZVwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBhbiB1bm5hbWVkIGNoZWNrYm94XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW1wiXCJdIHx8IFtdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfbG9uZW5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyaW5nIGEgbmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgIGNvbnN0IG51bVJhZGlvc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbY3R4TmFtZV0gfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG51bUNoZWNrYm94ZXNXaXRoTmFtZSA9IChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbY3R4TmFtZV0gfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIENhcGl0YWxpemUgdGhlIGlucHV0IHR5cGUgZm9yIG1lc3NhZ2VzXG4gICAgICAgICAgICBpZiAobnVtUmFkaW9zV2l0aE5hbWUgPiAwICYmIG51bUNoZWNrYm94ZXNXaXRoTmFtZSA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbmFtaW5nIG1pc21hdGNoIGJldHdlZW4gZGlmZmVyZW50IGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCIsIFtjdHhUeXBlLCBjdHhUeXBlID09PSBcImNoZWNrYm94XCIgPyBcInJhZGlvXCIgOiBcImNoZWNrYm94XCIsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4VHlwZSA9PT0gXCJSYWRpb1wiICYmIChmb3JtQ2FjaGUubnVtUmFkaW9zID09PSAxIHx8IG51bVJhZGlvc1dpdGhOYW1lID09PSAxKVxuICAgICAgICAgICAgICAgIHx8IGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsb25lIGNvbnRyb2wgKGVpdGhlciBvbmx5IGNvbnRyb2wgb2YgdGhpcyB0eXBlIG9uIHRoZSBwYWdlLCBvciBhIHJhZGlvIGJ1dHRvbiB3aXRob3V0IGFueSBvdGhlcnMgYnkgdGhhdCBuYW1lKVxuICAgICAgICAgICAgICAgIC8vIFdlIHBhc3MgdGhpcyBjb250cm9sIGluIGFsbCBjYXNlc1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2xvbmVub2dyb3VwXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIkNoZWNrYm94XCIgJiYgZm9ybUNhY2hlLm51bUNoZWNrYm94ZXMgPiAxICYmIG51bUNoZWNrYm94ZXNXaXRoTmFtZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgb25seSBvbmUgY2hlY2tib3ggd2l0aCB0aGlzIG5hbWUsIGJ1dCB0aGVyZSBhcmUgb3RoZXIgY2hlY2tib3hlcyBpbiB0aGUgZm9ybS5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgZ3JvdXBlZCwgYXNrIHRoZW0gdG8gZXhhbWluZSBpdFxuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIHNoYXJlIGEgbmFtZSB3aXRoIGFub3RoZXIgc2ltaWxhciBjb250cm9sLiBBcmUgd2UgZ3JvdXBlZCB0b2dldGhlcj9cbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtjdHhOYW1lXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGdyb3VwZWQsIGJ1dCBzb21lIGNvbnRyb2wgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGluIGEgZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiLCBbY3R4VHlwZSwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uZSBvZiB1cyBhcmUgZ3JvdXBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBjdHhHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW4gdGhlIG1haW4gZ3JvdXAgd2l0aCB0aGUgb3RoZXJzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm90c2FtZWdyb3VwXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgYWxsIGdyb3VwZWQgdXAhXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2ZpZWxkc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2ZpZWxkc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXQsIGRvbTp0ZXh0YXJlYSwgZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0luRmllbGRTZXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVXNlIHRoZSA8ZmllbGRzZXQ+IGVsZW1lbnQgdG8gZ3JvdXAgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSA8ZmllbGRzZXQ+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBmb3Igb3RoZXIgaW5wdXQgdHlwZXMgb3IgaWYgd2UncmUgaW4gYSBmaWVsZHNldFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInRleHRcIiAmJiB0eXBlICE9IFwiZmlsZVwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJmaWVsZHNldFwiKSAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIC8vIE5vIGZpZWxkc2V0IC0gc2VlIGlmIHRoaXMgaW5wdXQgaXMgYWxsIGJ5IGl0c2VsZiAtIG5vIG5lZWQgdG8gZ3JvdXAgc2luZ2xlIGlucHV0c1xuICAgICAgICBsZXQgcGFyZW50ID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiZm9ybVwiLCBcImJvZHlcIl0pO1xuICAgICAgICBsZXQgY2hlY2tUeXBlcyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIl07XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoZWNrVHlwZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjb250cm9scyA9IHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGVja1R5cGVzW2ldKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGNvbnRyb2xzLmxlbmd0aDsgKytqKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNvbnRyb2xzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGV4dGFyZWFzIGFuZCBzZWxlY3RzIHdpbGwgYmUgY2FsbGVkIHR5cGU9J3RleHQnXG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBjb250cm9sc1tqXS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gY29udHJvbHNbal0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpIDogXCJ0ZXh0XCI7XG4gICAgICAgICAgICAgICAgLy8gT25seSBmYWlsIGlmIHRoaXMgaXMgYW5vdGhlciBjb250cm9sIGluIHRoZSBmb3JtIGFuZCBpdHMgdHlwZSBpcyBhbm90aGVyIHRleHQtbGlrZSBpbnB1dFxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRyb2xzW2pdID09IHJ1bGVDb250ZXh0IHx8ICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiICYmIHR5cGUgIT0gXCJmaWxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfaGFzcG9wdXBfY29uZmxpY3Q6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtsaXN0XVthcmlhLWhhc3BvcHVwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiaW5wdXRfaGFzcG9wdXBfaW52YWxpZFwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwicG90ZW50aWFsX21pc3VzZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90eXBlX21pc3VzZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX21pc3VzZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGlucHV0PiBlbGVtZW50IHdpdGggYSAnbGlzdCcgYXR0cmlidXRlIHNob3VsZCBub3QgdXNlIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhICdsaXN0JyBhdHRyaWJ1dGUgZG9lcyBub3QgdXNlIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCB3aXRoIHR5cGUgXFxcInswfVxcXCIgYW5kICdsaXN0JyBhdHRyaWJ1dGUgdXNlcyBhbiBleHBsaWNpdCAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9taXN1c2VcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSBhbmQgJ2xpc3QnIGF0dHJpYnV0ZSB1c2VzIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgaXMgaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfbGlzdF90eXBlXCI6IFwiVGhlIGxpc3QgYXR0cmlidXRlIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHdpdGggdGhlIHR5cGUgXFxcInswfVxcXCIgaXMgaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfbGlzdF9lbGVtXCI6IFwiVGhlIGxpc3QgYXR0cmlidXRlIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IGRvZXMgbm90IHJlZmVyZW5jZSBhIGRhdGFsaXN0IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIGlmIHRoZSBmaWVsZHNldCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBsZXQgXCJhcmlhX3JvbGVfdmFsaWRcIiB0byBoYW5kbGUgaW52YWxpZCByb2xlLiBPbmx5IGFsbG93ZWQgcm9sZSBpcyBjb21ib2JveCB3aGljaCBpcyBpbXBsaWNpdC4gXG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmICFyb2xlcy5pbmNsdWRlcygnY29tYm9ib3gnKSkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgICAgICBcblxuICAgICAgICAvL3RyaWdnZXJpbmcgaW5wdXQgdHlwZXM6IHRleHQsIHNlYXJjaCwgdGVsLCB1cmwsIGVtYWlsLCBvciBtaXNzaW5nIG9yIGludmFsaWQgXG4gICAgICAgIGxldCB5ZXNUeXBlcyA9IFtcInRleHRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJlbWFpbFwiLCBcImRhdGVcIiwgXCJtb250aFwiLCBcIndlZWtcIiwgXCJ0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLCBcImNvbG9yXCJdO1xuICAgICAgICBsZXQgbm9UeXBlcyA9IFtcImZpbGVcIiwgXCJwYXNzd29yZFwiLCBcImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJzdWJtaXRcIiwgXCJyZXNldFwiLCBcImltYWdlXCIsIFwiaGlkZGVuXCIsIFwiYnV0dG9uXCJdO1xuXG4gICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICAvL21pc3NpbmcgaW5wdXQgdHlwZSBmb3IgbGlzdCBidXQgd2l0aCBhcmlhX2hhc19wb3B1cFxuICAgICAgICBpZiAoIWF0dHJWYWx1ZSB8fCBhdHRyVmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX21pc3VzZVwiKTtcblxuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaW52YWxpZCBpbnB1dCB0eXBlcyBmb3IgbGlzdCBidXQgd2l0aCBhcmlhX2hhc19wb3B1cFxuICAgICAgICBpZiAoIXllc1R5cGVzLmluY2x1ZGVzKGF0dHJWYWx1ZSkgJiYgIW5vVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX21pc3VzZVwiKTtcblxuICAgICAgICAvLyB0aGUgbGlzdCBhdHRyaWJ1dGUgaXMgdXNlZCBmb3Igd3JvbmcgaW5wdXQgdHlwZVxuICAgICAgICBpZiAoYXR0clZhbHVlICYmIG5vVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIik7XG5cbiAgICAgICAgbGV0IGxpc3QgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsaXN0XCIpO1xuICAgICAgICAvLyB0aGUgbGlzdCBhdHRyaWJ1dGUgaXMgYmxhbmtcbiAgICAgICAgaWYgKCFsaXN0IHx8IGxpc3QudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIik7XG5cbiAgICAgICAgbGV0IGxpc3RFbGVtID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaXN0KTtcbiAgICAgICAgLy8gdGhlIGxpc3QgZWxlbWVudCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGlmICghbGlzdEVsZW0pXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiKTtcblxuICAgICAgICAvLyB0aGUgbGlzdCBlbGVtZW50IGlzIG5vdCBhIGRhdGFsaXN0IGVsZW1lbnRcbiAgICAgICAgaWYgKGxpc3RFbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfbGlzdF9lbGVtXCIpO1xuXG4gICAgICAgIC8vIHZhbGlkIGlucHV0IHR5cGVzIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwICAgIFxuICAgICAgICBpZiAoeWVzVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCIsIFthdHRyVmFsdWVdKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHNob3VsZG4ndCBnZXQgaGVyZSBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2FmdGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2FmdGVyXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDaGVja2JveCBvciByYWRpbyBidXR0b24gaXMgbmVzdGVkIGluIGxhYmVsLCBzbyBsYWJlbCBpcyBub3QgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGJlZm9yZSBpdHMgYXNzb2NpYXRlZCBjaGVja2JveCBvciByYWRpbyBidXR0b24gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgbXVzdCBoYXZlIGEgbGFiZWwgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpXG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodHlwZSAhPSBcImNoZWNrYm94XCIgJiYgdHlwZSAhPSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0gPT09IG51bGwgfHwgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IENvbW1vblV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vbGV0IHdhbGtOb2RlID0gbmV3IE5vZGVXYWxrZXIobGFiZWxFbGVtKTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IG5ldyBET01XYWxrZXIobGFiZWxFbGVtKTtcbiAgICAgICAgICAgIHdhbGtOb2RlLm5vZGUgPSBydWxlQ29udGV4dDtcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAoKHdhbGtOb2RlLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCIjdGV4dFwiICYmIHdhbGtOb2RlLm5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNwYW5cIiAmJiB3YWxrTm9kZS5ub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIElucHV0IG5lc3RlZCBpbiBsYWJlbCBhbmQgdGV4dCBiZWZvcmUgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGxhYmVsIGlzIGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2JlZm9yZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9iZWZvcmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfTGFiZWxCZWZvcmVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUZXh0IGlucHV0IGlzIG5lc3RlZCBpbiBsYWJlbCBzdWNoIHRoYXQgaW5wdXQgcHJlY2VkZXMgdGhlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGFmdGVyIGl0cyBhc3NvY2lhdGVkIHRleHQgaW5wdXQgb3IgPHNlbGVjdD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgaW5wdXRzIGFuZCA8c2VsZWN0PiBlbGVtZW50cyBtdXN0IGhhdmUgYSBsYWJlbCBiZWZvcmUgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxhYmVsRWxlbSA9PSBudWxsIHx8ICFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gZGVwZW5kZW5jeSwgbGFiZWwgbXVzdCBiZSBkb25lIHZpYSB0aXRsZSAtIHRoaXMgcnVsZSBkb2Vzbid0IGFwcGx5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IENvbW1vblV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaWdub3JlIGlmIG5vIGxhYmVsIG9yIHRoZSBjb250ZW50IGZvciB0aGUgbGFiZWwgaXMgb25seSBmcm9tIHRoZSBuZXN0ZWQgaW5wdXQgY29udHJvbCBcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCAmJiBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpID09PSB0ZXh0LnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInNwYW5cIiAmJiB3YWxrTm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnB1dCBuZXN0ZWQgaW4gbGFiZWwgYW5kIHRleHQgYWZ0ZXIgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBsYWJlbCBpcyBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXZlbid0IHJldHVybmVkIHlldCwgdGhlbiBJIHBhc3NcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpyYWRpbyxhcmlhOnNlYXJjaGJveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTpzd2l0Y2gsYXJpYTp0ZXh0Ym94LGFyaWE6cHJvZ3Jlc3NiYXIsZG9tOmlucHV0W3R5cGU9ZmlsZV0sZG9tOm91dHB1dCxkb206bWV0ZXIsZG9tOmlucHV0W3R5cGU9cGFzc3dvcmRdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9yZWR1bmRhbnRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfRXhwbGljaXRMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBlbGVtZW50IDx7MH0+IGhhcyBubyBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZvcm0gY29udHJvbCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGZvcm0gY29udHJvbCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIC8qIHJlbW92ZSAxLjEuMSBtYXBwaW5nLCBrZWVwIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogaHR0cHM6Ly9naXRodWIuY29tL0lCTWEvZXF1YWwtYWNjZXNzL2lzc3Vlcy83NTZcbiAgICBhY3Q6IFtcIjk3YTRlMVwiLCBcImUwODZlNVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIiB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiYnV0dG9uXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gXCJidXR0b25lbGVtXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiB0eXBlID09IFwiXCIpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGVkIGJ5IGlucHV0X2xhYmVsX2V4aXN0c0ltYWdlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuLyoqIFxuICAgICAgICBsZXQgUE9GID0gLTE7XG4gICAgICAgIGxldCB0ZXh0VHlwZXMgPSBDb21tb25VdGlsLmlucHV0X3RleHRfdHlwZXM7XG4gICAgICAgIGxldCBidXR0b25UeXBlcyA9IENvbW1vblV0aWwuZm9ybV9idXR0b25fdHlwZXM7ICBcbiAgICAgICBcbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzV2l0aERlZmF1bHRzID0gW1wicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vICdzdWJtaXQnIGFuZCAncmVzZXQnIGhhdmUgdmlzaWJsZSBkZWZhdWx0cy5cbiAgICAgICAgaWYgKHRleHRUeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGluIHRoZSBsaXN0XG4gICAgICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnRzLCBpbiB0aGUgY2FzZSB0aGF0IGEgbGFiZWwgaXMgaGlkZGVuIHRoZW4gaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgICAgICAgIC8vIE5vdGU6IGxhYmVsW2Zvcl0gZG9lcyBub3Qgd29yayBmb3IgQVJJQSBkZWZpbmVkIGlucHV0c1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgPyBudWxsIDogQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgbGV0IGhhc0xhYmVsRWxlbUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsRWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsbGVkQnlFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQobGFiZWxFbGVtLCBsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbGxlZEJ5RWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbGxlZEJ5RWxlbSwgbGFiZWxFbGVtKSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChsYWJlbGxlZEJ5RWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFzc2VkID0gKCEhbGFiZWxFbGVtICYmIGhhc0xhYmVsRWxlbUNvbnRlbnQpIHx8XG4gICAgICAgICAgICAgICAgKCFsYWJlbEVsZW0gJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKSB8fFxuICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAgfHwgQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIGlmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGEgYnV0dG9uXG4gICAgICAgICAgICBpZiAoYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMuaW5kZXhPZih0eXBlKSAhPT0gLTEgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzIHNvIHBhc3MgaWYgdGhlcmUgaXMgbm8gJ3ZhbHVlJyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInZhbHVlXCIpIHx8IEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJidXR0b25lbGVtXCIpIHtcbiAgICAgICAgICAgIC8vIElmIEkgYW0gYW4gaW1hZ2UgYW5kIEkgaGF2ZSBhbHQgdGV4dCAtIGFjY2Vzc2liaWxpdHktd2ViLWVuZ2luZSMyNjlcbiAgICAgICAgICAgIGxldCBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYkFsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSB8fCBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IGJBbHQgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcblxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgYSBuYXRpdmUgYnV0dG9uIGlzIGxhYmVsbGVkXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWwpKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlOyAgICBcbiAgICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIXBhc3NlZCAmJiAoYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgPT0gXCJkaWppdE9mZlNjcmVlblwiICYmIERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5oYXNBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGRpaml0IGJ1dHRvbnNcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxJZCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5nZXRBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSArIFwiX2xhYmVsXCI7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsSWQpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyBJIGZhaWxlZCBhYm92ZSBhbHNvXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDQgKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgLy8gSXMgYSBub24tZW1wdHkgdmFsdWUgYXR0cmlidXRlIGFsc28gZW5vdWdoIGZvciBhbiBvcHRpb24gZWxlbWVudD9cbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIikgfHwgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMztcbiAgICAgICAgfSBcbiAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKVxuICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgYXJpYSByb2xlIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGFjY2Vzc2libGUgbmFtZSBjYW4gYmUgZnJvbSBjb250ZW50IFxuICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAvL3doZW4gbXVsdGlwbGUgcm9sZXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBmaXJzdCB2YWxpZCByb2xlIChndWFyYW50ZWVkIGJ5IGRlcGVuZGVuY2llcykgaXMgYXBwbGllZCwgYW5kIHRoZSBvdGhlcnMganVzdCBhcyBmYWxsYmFja3NcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuKi9cbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIHBhc3NlZCA9IHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5zcGxpdChcIiBcIikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtub2RlTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImlucHV0X2xhYmVsX2V4aXN0c1wiXSwgXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfVmlzaWJsZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9ub19sYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fbGFiZWxcIjogXCJpbnB1dF9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGhhcyBhbiBhc3NvY2lhdGVkIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIjogXCJUaGUg4oCYcGxhY2Vob2xkZXLigJkgaXMgdGhlIG9ubHkgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fbGFiZWxcIjogXCJUaGUgaW5wdXQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGlucHV0IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi41LjNcIiwgXCIzLjMuMlwiXSwgLy9tYXAgdG8gYm90aCByZXF1aXJlbWVudHMgaW4gaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZiBhIGNvbnRyb2wgaXMgaW4gYSB0YWJsZSBjZWxsLCB0aGUgY29sIGhlYWRlcnMgY2FuIGFjdCBhcyB2aXNpYmxlIGxhYmVsLCB3aGljaCBpcyBjaGVja2VkIGluIHRhYmxlIGhlYWRpbmcgcnVsZVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIHdoZW4gaW4gYSBjb21ib2JveCwgb25seSBsb29rIGF0IHRoZSBpbnB1dCB0ZXh0Ym94LlxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSAmJlxuICAgICAgICAgICAgIShBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwic2VhcmNoYm94XCIpIHx8XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCAobm9kZU5hbWUgPT09IFwic2VsZWN0XCIgJiYgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIHJvbGVzVG9DaGVja1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3hlcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4ocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShjb21ib2JveCwgXCJhcmlhLW93bnNcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmlhX293bnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25zID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGFyaWFfb3ducy50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25zW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWQgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIC8vIGNoZWNrIHZpc2libGUgbGFiZWwgZm9yIGlucHV0IG9yIGJ1dHRvblxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgfHwgbm9kZU5hbWUgPT09ICdidXR0b24nKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmhhc0ltcGxpY2l0TGFiZWwocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChsYWJlbCAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgIFxuXG4gICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2VzXG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgdHlwZSkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgLy9zdWJtaXQgdHlwZSBvZiBpbnB1dCBoYXMgYSB2aXNpYmxlIGxhYmVsICdTdWJtaXQnIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICAvL2ltYWdlIHR5cGUgb2YgaW5wdXQgcmVxdWlyZXMgYSBub24tZW1wdHkgYWx0IHRleHRcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2ltYWdlJyAmJiBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwICYmIChwYWlyLm5hbWVGcm9tID09PSAnbGFiZWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdpbnRlcm5hbCcgfHwgcGFpci5uYW1lRnJvbSA9PT0gJ2FsdCcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjdXN0b20gd2lkZ2V0IHN1Ym1pc3Npb24gaXMgbm90IGluIHNjb3BlIGZvciB0aGlzIHN1Y2Nlc3MgY3JpdGVyaWEgKElCTWEvZXF1YWwtYWNjZXNzIzIwNCkgaWYgaXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBkYXRhIGVudHJ5XG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHJvbGUgJiYgcm9sZSA9PT0gXCJidXR0b25cIiAmJiBub2RlTmFtZSAhPT0gJ2lucHV0JyAmJiBub2RlTmFtZSAhPT0gJ2J1dHRvbicpIHsgICAgXG4gICAgICAgICAgICAvLyBsaWtlbHkgYSBjdXN0b20gd2lkZ2V0LCBza2lwIGlmIG5vdCBhc3NvY2lhdGVkIHdpdGggZGF0YSBlbnRyeVxuICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImZvcm1cIikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYW55IHZpc2libGUgdGV4dCBmcm9tIHRoZSBjb250cm9sLiBcbiAgICAgICAgLy8gbm90ZSB0aGF0ICgxKSB0aGUgdGV4dCBkb2VzbuKAmXQgbmVlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRyb2wgdG8gZm9ybSBhIHJlbGF0aW9uc2hpcFxuICAgICAgICAvLyAgKDIpIHRoZSB0ZXh0IGRvZXNuJ3QgbmVlZCB0byBmb2xsb3cgYWNjZXNzaWJsZSBuYW1lIHJlcXVpcmVtZW50IChlLmcuIG5hbWVGcm9tKVxuICAgICAgICAvLyAgYW5kICgzKSBhbiBhbHRlcm5hdGl2ZSB0b29sdGlwIGV4aXN0cyB0aGF0IGNhbiBiZSBtYWRlIHZpc2libGUgdGhyb3VnaCBtb3VzZW92ZXJcbiAgICAgICAgLyoqaWYgKCFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIGlmIGFuIGFsdGVybmF0aXZlIHRvb2x0aXAgZXhpc3RzIHRoYXQgY2FuIGJlIG1hZGUgdmlzaWJsZSB0aHJvdWdoIG1vdXNlb3ZlclxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7IFxuICAgICAgICAqLyBcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ3RleHQnIHx8IHBhaXIubmFtZUZyb20gPT09ICd0aXRsZScpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBhbnkgZGVzY2VuZGFudCB3aXRoIGFuIGFsdGVybmF0aXZlIHRvb2x0aXAgdGhhdCBjYW4gYmUgbWFkZSB2aXNpYmxlIHRocm91Z2ggbW91c2VvdmVyXG4gICAgICAgIC8vIG9ubHkgY29uc2lkZXIgaW1nIGFuZCBzdmcsIGFuZCBvdGhlciB0ZXh0IGNvbnRlbnQgb2YgdGhlIGRlc2NlbmRhbnQgaXMgY292ZXJlZCBpbiB0aGUgaXNJbm5lclRleHQgYWJvdmUgIFxuICAgICAgICBsZXQgZGVzY2VuZGFudHMgPSBBcmlhVXRpbC5nZXRBbGxEZXNjZW5kYW50c1dpdGhSb2xlcyhydWxlQ29udGV4dCwgW1wiaW1nXCIsIFwiZ3JhcGhpY3MtZG9jdW1lbnRcIiwgXCJncmFwaGljcy1vYmplY3RcIiwgXCJncmFwaGljcy1zeW1ib2xcIl0sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnRzICYmIGRlc2NlbmRhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGQ9MDsgZCA8IGRlc2NlbmRhbnRzLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZGVzY2VuZGFudHNbZF0sIFwidGl0bGVcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShkZXNjZW5kYW50c1tkXSwgXCJhbHRcIikpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9IFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHZpc2libGUgbGFiZWwgcG9pbnRlZCB0byBieSB0aGUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZS5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBsZXQgdGhlTGFiZWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgICAgICAgICBsZXQgbGFiZWxWYWx1ZXMgPSB0aGVMYWJlbC5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbFZhbHVlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50QnlJZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBsYWJlbFZhbHVlc1tqXSk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRCeUlkICYmICFET01VdGlsLnNhbWVOb2RlKGVsZW1lbnRCeUlkLCBydWxlQ29udGV4dCkgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnRCeUlkKSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50QnlJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqaWYgKG5vZGVOYW1lID09PSBcIm9wdGdyb3VwXCIgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIFxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJvcHRpb25cIiAmJiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKSB8fCBydWxlQ29udGV4dC5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA+IDApKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKChub2RlTmFtZSA9PT0gXCJvcHRncm91cFwiIHx8IG5vZGVOYW1lID09IFwib3B0aW9uXCIpICYmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgKHBhaXIubmFtZUZyb20gPT09ICdsYWJlbCcgfHwgcGFpci5uYW1lRnJvbSA9PT0gJ2NvbnRlbnQnKSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIHRoZSBsYWJlbCBiZWxvbmdzIHRvIHRoZSBjb21ib2JveFxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHM9JyR7aWR9J11bcm9sZT0nY29tYm9ib3gnXWApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBhIHBsYWNlaG9sZGVyIGV4aXN0cyBldmVuIHRob3VnaCBhIHBsYWNlaG9sZGVyIHRleHQgaXMgbm90IHN1ZmZpY2llbnQgYXMgYSB2aXNpYmxlIHRleHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicGxhY2Vob2xkZXJcIikpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCIpO1xuXG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX25vX2xhYmVsXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9vbmNoYW5nZV9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbb25jaGFuZ2VdLCBkb206dGV4dGFyZWFbb25jaGFuZ2VdLCBkb206c2VsZWN0W29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0hhc09uY2hhbmdlXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF93YXJuaW5nXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3dhcm5pbmdcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlcnMgbXVzdCBiZSBhZHZpc2VkIGlmLCBkdWUgdG8gYSBjaGFuZ2Ugb2YgZWxlbWVudCB2YWx1ZSwgYSBmb3JtIGF1dG9tYXRpY2FsbHkgc3VibWl0cywgYSBuZXcgd2luZG93IG9wZW5zLCBvciBhIGNoYW5nZSBpbiBmb2N1cyBvY2N1cnNcIixcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSB1c2VyIGlzIGFkdmlzZWQgb2YgdGhlIGF1dG9tYXRpYyBmb3JtIHN1Ym1pc3Npb24sIG5ldyB3aW5kb3cgb3BlbmluZywgb3IgZm9jdXMgY2hhbmdlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuaW5nXCI6IFwiQ29uZmlybSB0aGF0IHRoZSB1c2VyIGlzIGFkdmlzZWQgaWYsIGR1ZSB0byBhIGNoYW5nZSBvZiBlbGVtZW50IHZhbHVlLCBhIGZvcm0gYXV0b21hdGljYWxseSBzdWJtaXRzLCBhIG5ldyB3aW5kb3cgb3BlbnMsIG9yIGEgY2hhbmdlIGluIGZvY3VzIG9jY3Vyc1wiICAgIFxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PT0gXCJzdWJtaXRcIiB8fCB0eXBlID09PSBcImltYWdlXCIgfHwgdHlwZSA9PT0gXCJidXR0b25cIiB8fCB0eXBlID09PSBcInJlc2V0XCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF93YXJuaW5nXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbcGxhY2Vob2xkZXJdLCBkb206dGV4dGFyZWFbcGxhY2Vob2xkZXJdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0lucHV0X1BsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJQb3RlbnRpYWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiSFRNTDUgcGxhY2Vob2xkZXIgaXMgdGhlIG9ubHkgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIkFkZGl0aW9uYWwgdmlzaWJsZSBsYWJlbCByZWZlcmVuY2VkIGJ5ICdhcmlhLWxhYmVsbGVkYnknIGlzIG5vdCB2YWxpZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhUTUw1ICdwbGFjZWhvbGRlcicgYXR0cmlidXRlIG11c3Qgbm90IGJlIHVzZWQgYXMgYSB2aXNpYmxlIGxhYmVsIHJlcGxhY2VtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogbWVyZ2UgdGhlIHJ1bGUgaW50byBpbnB1dF9sYWJlbF92aXNpYmxlXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjMuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgKi9cbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSBcImhpZGRlblwiIHx8IHR5cGUgPT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJoaWRkZW5cIikpIHtcbiAgICAgICAgICAgIGxldCBoaWRkZW4gPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBpZiAoaGlkZGVuID09IFwiXCIgfHwgaGlkZGVuLnRvTG93ZXJDYXNlKCkgPT0gXCJoaWRkZW5cIikgeyAvLyB3aGVuIGhpZGRlbiBpcyBlbXB0eSBpbiB0aGUgZWxlbWVudCwgXCJcIiBpcyByZXR1cm5lZCwgc2FtZSBhcyBpdCBoYXMgYSB2YWx1ZSBvZiBcIlwiLlxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpO1xuICAgICAgICAgICAgbGV0IHJlZklkcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoL1xccysvKTsgLy8gc2VwYXJhdGVkIGJ5IG9uZSBvciBtb3JlIHdoaXRlIHNwYWNlc1xuICAgICAgICAgICAgaWYgKCFyZWZJZHMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxhYmVsX2NvbnRlbnRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206bGFiZWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfTGFiZWxfSGFzQ29udGVudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcIlBhc3NfUmVndWxhclwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcIlBhc3NfQXJpYUxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcIlBhc3NfTGFiZWxsZWRCeVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzX1JlZ3VsYXJcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHdpdGggaW5uZXIgY29udGVudFwiLFxuICAgICAgICAgICAgXCJQYXNzX0FyaWFMYWJlbFwiOiBcIjxsYWJlbD4gZWxlbWVudCBoYXMgYWNjZXNzaWJsZSBuYW1lIHZpYSAnYXJpYS1sYWJlbCdcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgdmlhICdhcmlhLWxhYmVsbGVkYnknXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8bGFiZWw+IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBkZXNjcmlwdGl2ZSB0ZXh0IHRoYXQgaWRlbnRpZmllcyB0aGUgZXhwZWN0ZWQgaW5wdXRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxsYWJlbD4gZWxlbWVudCBtdXN0IGhhdmUgbm9uLWVtcHR5IGRlc2NyaXB0aXZlIHRleHQgdGhhdCBpZGVudGlmaWVzIHRoZSBwdXJwb3NlIG9mIHRoZSBpbnRlcmFjdGl2ZSBjb21wb25lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfUmVndWxhclwiKTtcblxuICAgICAgICB9IGVsc2UgaWYgKChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8IFwiXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0FyaWFMYWJlbFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICBpZiAobGFiZWxFbGVtICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsRWxlbSwgcnVsZUNvbnRleHQpICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzX0xhYmVsbGVkQnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxhYmVsX25hbWVfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJsYWJlbF9uYW1lX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpncmlkY2VsbCxhcmlhOmxpbmssYXJpYTptZW51aXRlbSxhcmlhOm1lbnVpdGVtY2hlY2tib3gsYXJpYTptZW51aXRlbXJhZGlvLGFyaWE6b3B0aW9uLGFyaWE6cmFkaW8sYXJpYTpzd2l0Y2gsYXJpYTp0YWIsYXJpYTp0cmVlaXRlbSxkb206aW5wdXQsZG9tOnRleHRhcmVhLGRvbTpzZWxlY3QsZG9tOm91dHB1dCxkb206bWV0ZXJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMV9MYWJlbF9BY2Nlc3NpYmxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGFiZWxfbmFtZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGFiZWxfbmFtZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJBY2Nlc3NpYmxlIG5hbWUgbWF0Y2hlcyBvciBjb250YWlucyB0aGUgdmlzaWJsZSBsYWJlbCB0ZXh0XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkFjY2Vzc2libGUgbmFtZSBkb2VzIG5vdCBtYXRjaCBvciBjb250YWluIHRoZSB2aXNpYmxlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBY2Nlc3NpYmxlIG5hbWUgbXVzdCBtYXRjaCBvciBjb250YWluIHRoZSB2aXNpYmxlIGxhYmVsIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjUuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBSZXZpZXcgaHR0cHM6Ly9naXRodWIuY29tL2FjdC1ydWxlcy9hY3QtcnVsZXMuZ2l0aHViLmlvL2lzc3Vlcy8xNjE4XG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjEvVGVjaG5pcXVlcy9hcmlhL0FSSUEyNFxuICAgIGFjdDogXCIyZWU4YjhcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8XG4gICAgICAgICAgICBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXNzIGlmIHRoZSB2aXNpYmxlIHRleHQgdXNlcyBNYXRlcmlhbCBJY29uIGZvbnRcbiAgICAgICAgaWYgKENTU1V0aWwuaXNNYXRlcmlhbEljb25Gb250KHJ1bGVDb250ZXh0KSkgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgaXNJbnB1dEJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICAvL2xldCBidXR0b25UeXBlcyA9IFtcImJ1dHRvblwiLCBcInJlc2V0XCIsIFwic3VibWl0XCJdOyAvL1wiaW1hZ2VcIlxuICAgICAgICBsZXQgaW5wdXRUeXBlID0gbnVsbDtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgaW5wdXRUeXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZm9ybV9idXR0b25fdHlwZXMuaW5kZXhPZihpbnB1dFR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlzSW5wdXRCdXR0b24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRoZUxhYmVsQnkgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKHRoZUxhYmVsQnkgJiYgIUNvbW1vblV0aWwuaXNJZFJlZmVyVG9TZWxmKHJ1bGVDb250ZXh0LCB0aGVMYWJlbEJ5KSAmJiAhaXNJbnB1dEJ1dHRvbikge1xuICAgICAgICAgICAgLy8gc2tpcCB0aGUgY2hlY2tzIGlmIGl0IGhhcyBhbiBhcmlhLWxhYmVsbGVkYnkgc2luY2UgaXQgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0aGVMYWJlbCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhlTGFiZWxCeSAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYocnVsZUNvbnRleHQsIHRoZUxhYmVsQnkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsVmFsdWVzID0gdGhlTGFiZWxCeS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGFiZWxWYWx1ZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRCeUlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnRCeUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGVMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGVMYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgdGV4dCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChpc0lucHV0QnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgLyogTm90ZTogRGlzYWJsZSB0aGUgYWx0IGNoZWNrIGluIGltYWdlcyB1bnRpbCB3ZSBnZXQgY29uZmlybWF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0VHlwZT09PVwiaW1hZ2VcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpe1xuICAgICAgICAgICAgICAgICAgICAvLyB1c2UgJ2FsdCcgYXR0cmlidXRlIGFzIHZpc2libGUgdGV4dFxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIH1lbHNlIFxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSAndmFsdWUnIGF0dHJpYnV0ZSBhcyB2aXNpYmxlIHRleHRcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGUgPT09IFwic3VibWl0XCIvKnx8aW5wdXRUeXBlPT09XCJpbWFnZVwiKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0VHlwZSA9PT0gXCJyZXNldFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJyZXNldFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGEgPGxhYmVsPiBlbGVtZW50XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsYWJlbFwiIC8qJiYgUlBUVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgcnVsZUNvbnRleHQpKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEVsZW0gPSBDb21tb25VdGlsLnJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChwYXJlbnRDbG9uZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudCA9IGxhYmVsRWxlbSA/IGxhYmVsRWxlbSA6IHJ1bGVDb250ZXh0O1xuXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRzVG9Ta2lwQ29udGVudENoZWNrID0gW1wibWV0ZXJcIiwgXCJvdXRwdXRcIiwgXCJwcm9ncmVzc1wiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCJdO1xuICAgICAgICAgICAgICAgIGlmICghbGFiZWxFbGVtICYmIGVsZW1lbnRzVG9Ta2lwQ29udGVudENoZWNrLmluZGV4T2Yobm9kZU5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gXCJcIjsgLy8gc2tpcCBjb250ZW50IGNoZWNrIGZvciBzb21lIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSB2aXNpYmxlIHRleHQgb25seVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRPblNjcmVlbklubmVyVGV4dChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKiBOb3RlOiBEaXNhYmxlIHRoaXMgYWx0IGNoZWNrIGluIGltYWdlcyBmb3Igbm93IHVudGlsIHdlIGdldCBjb25maXJtYXRpb25cbiAgICAgICAgICAgICAgICAvLyBMb29rIGZvciB0aGUgYWx0IGF0dHJpYnV0ZSBvZiBhbiBpbWFnZSB3aGljaCBpcyBjb25zaWRlcmVkIHZpc2libGUgdGV4dC5cbiAgICAgICAgICAgICAgICBsZXQgaGFzSW1nQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBudyA9IFJQVFV0aWwubmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICghaGFzSW1nQWx0ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50ICYmIG53Lm5vZGUgIT0gZWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW1nQWx0ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImltZ1wiICYmIFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0ltZ0FsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0ID8gdGV4dCArIG53Lm5vZGUuZ2V0QXR0cmlidXRlKFwiYWx0XCIpIDogbncubm9kZS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG5vbmFscGhhbnVtZXJpYyA9IC9bXmEtekEtWjAtOV0vZztcblxuICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShub25hbHBoYW51bWVyaWMsIFwiIFwiKTsgLy8gb25seSBjb25zaWRlciBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWRUZXh0ID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRleHQpLnRvTG93ZXJDYXNlKCk7IC8vIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGRpZmZlcmVuY2UgaW4gY2FzZSBzZW5zaXRpdml0eSBzaG91bGQgYmUgaWdub3JlZC5cblxuICAgICAgICAgICAgdGhlTGFiZWwgPSB0aGVMYWJlbC5yZXBsYWNlKG5vbmFscGhhbnVtZXJpYywgXCIgXCIpOyAvLyBvbmx5IGNvbnNpZGVyIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRoZUxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZFRleHQubGVuZ3RoID4gMSkgeyAvLyBza2lwIG5vbi10ZXh0IGNvbnRlbnQuIGUuZy4sIDxidXR0b24gYXJpYS1sYWJlbD1cImNsb3NlXCI+WDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIGxldCBsb2NhdGlvbiA9IG5vcm1hbGl6ZWRMYWJlbC5pbmRleE9mKG5vcm1hbGl6ZWRUZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEF2b2lkIG1hdGNoaW5nIHBhcnRpYWwgd29yZHMuZS5nLiwgdGV4dCBcIm5hbWVcIiBzaG91bGQgbm90IG1hdGNoICdzdXJuYW1lJyBvciAnbmFtZXMnXG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID49IDAgJiYgbm9ybWFsaXplZExhYmVsLmxlbmd0aCA+IG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGV0dGVycyA9IC9eWzAtOWEtekEtWl0rJC87XG4gICAgICAgICAgICAgICAgICAgIGlmICgobG9jYXRpb24gKyBub3JtYWxpemVkVGV4dC5sZW5ndGgpIDwgbm9ybWFsaXplZExhYmVsLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhlQ2hhciA9IG5vcm1hbGl6ZWRMYWJlbC5jaGFyQXQobG9jYXRpb24gKyBub3JtYWxpemVkVGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUNoYXIubWF0Y2gobGV0dGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkICYmIGxvY2F0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYmVnaW5uaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhlQ2hhciA9IG5vcm1hbGl6ZWRMYWJlbC5jaGFyQXQobG9jYXRpb24gLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVDaGFyLm1hdGNoKGxldHRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09PSAtMSkgeyAvLyBjaGVjayB0aGF0IHZpc2libGUgdGV4dCBjb250ZW50IG9mIHRoZSB0YXJnZXQgaXMgY29udGFpbmVkIHdpdGhpbiBpdHMgYWNjZXNzaWJsZSBuYW1lLlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBsYWJlbF9yZWZfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfcmVmX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206bGFiZWxbZm9yXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0xhYmVsX1JlZlZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2ludmFsaWRcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJsYWJlbF9yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJsYWJlbF9yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ2ZvcicgYXR0cmlidXRlIGZvciBhIGxhYmVsIHJlZmVyZW5jZWEgYSB1bmlxdWUgbm9uLWVtcHR5ICdpZCcgYXR0cmlidXRlIG9mIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJUaGUgdmFsdWUgXFxcInswfVxcXCIgb2YgdGhlICdmb3InIGF0dHJpYnV0ZSBpcyBub3QgdGhlICdpZCcgb2YgYSB2YWxpZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdmb3InIGF0dHJpYnV0ZSBmb3IgYSBsYWJlbCBzaG91bGQgcmVmZXJlbmNlIGEgbm9uLWVtcHR5LCB1bmlxdWUgJ2lkJyBhdHRyaWJ1dGUgb2YgYSB2YWxpZCBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHRhcmdldCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiBib3RoIGxhYmVsIGFuZCBjb250cm9sIGFyZSBpbnZpc2libGVcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHRhcmdldCkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBoYW5kbGVzIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCF0YXJnZXQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgIC8vIEZhaWwgaWYgd2UncmUgcG9pbnRpbmcgYXQgc29tZXRoaW5nIHRoYXQgaXMgbGFiZWxsZWQgYnkgYW5vdGhlciBtZWNoYW5pc21cbiAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT0gXCJzZWxlY3RcIiB8fCBub2RlTmFtZSA9PSBcInRleHRhcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIiB8fCBub2RlTmFtZSA9PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJvcHRncm91cFwiIHx8IG5vZGVOYW1lID09IFwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJrZXlnZW5cIiB8fCBub2RlTmFtZSA9PSBcIm91dHB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGVOYW1lID09IFwicHJvZ3Jlc3NcIiB8fCBub2RlTmFtZSA9PSBcIm1ldGVyXCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJmaWVsZHNldFwiIHx8IG5vZGVOYW1lID09IFwibGVnZW5kXCI7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiB0YXJnZXQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT0gXCJ0ZXh0XCIgfHwgdHlwZSA9PSBcInBhc3N3b3JkXCIgfHwgdHlwZSA9PSBcImZpbGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImNoZWNrYm94XCIgfHwgdHlwZSA9PSBcInJhZGlvXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJoaWRkZW5cIiB8fCB0eXBlID09IFwic2VhcmNoXCIgfHwgdHlwZSA9PSBcInRlbFwiIHx8IHR5cGUgPT0gXCJ1cmxcIiB8fCB0eXBlID09IFwiZW1haWxcIiB8fCAgLy9IVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJkYXRlXCIgfHwgdHlwZSA9PSBcIm51bWJlclwiIHx8IHR5cGUgPT0gXCJyYW5nZVwiIHx8IHR5cGUgPT0gXCJpbWFnZVwiIHx8IC8vSFRNTCA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwidGltZVwiIHx8IHR5cGUgPT0gXCJjb2xvclwiIHx8ICAvLyBIVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJkYXRldGltZS1sb2NhbFwiIHx8IHR5cGUgPT0gXCJtb250aFwiIHx8IHR5cGUgPT0gXCJ3ZWVrXCI7IC8vSFRNTDUuMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIG9uZSBtb3JlIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgTk9UIGhpZGRlbiwgaW4gdGhlIGNhc2UgdGhlIHRhcmdldCBpcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIGZsYWcgYSB2aW9sYXRpb24gcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIGlzLlxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0VG9rZW46IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXRUb2tlbi5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbl0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9pbnZhbGlkXCIsIHJldFRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNvbnN0IGxpc3RfY2hpbGRyZW5fdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGlzdF9jaGlsZHJlbl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpncm91cFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19MaXN0X0dyb3VwX0xpc3RJdGVtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfY2hpbGRyZW5fdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJMaXN0IGNvbXBvbmVudCB3aXRoIFxcXCJncm91cFxcXCIgcm9sZSBoYXMgY2hpbGRyZW4gdGhhdCBhcmUgbm90IDxsaXN0aXRlbT4gZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXN0IGNvbXBvbmVudCB3aXRoIFxcXCJncm91cFxcXCIgcm9sZSBtdXN0IGxpbWl0IGNoaWxkcmVuIHRvIDxsaXN0aXRlbT4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHBhcmVudCwgXCJsaXN0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZHJlbjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhjaGlsZHJlbltpXSwgXCJsaXN0aXRlbVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxpc3RfbWFya3VwX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X21hcmt1cF9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGlzdF9Vc2VNYXJrdXBcIjoge1xuICAgICAgICAgICAgLy8gXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9saXN0XCI6IFwibGlzdF9tYXJrdXBfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiUHJvcGVyIEhUTUwgZWxlbWVudHMgYXJlIHVzZWQgdG8gY3JlYXRlIGEgbGlzdFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbGlzdFwiOiBcIlZlcmlmeSB0aGlzIGlzIGEgbGlzdCBhbmQgaWYgc28sIG1vZGlmeSB0byB1c2UgcHJvcGVyIEhUTUwgZWxlbWVudHMgZm9yIHRoZSBsaXN0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvcGVyIEhUTUwgZWxlbWVudHMgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGEgbGlzdFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGVOYW1lIG9mIHRoZSBjb250ZXh0IG5vZGVcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiXSkgPT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIHNjcmlwdCwgbGFiZWwgYW5kIHRoZWlyIGNoaWxkIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzY3JpcHRcIiwgJ2xhYmVsJ10pICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGFsbCB3aWRnZXRzIGFuZCB0aGVpciBjaGlsZHJlbiwgYW5kIGNlcnRhaW4gc3RydWN0dXJlIHJvbGVzXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKHJ1bGVDb250ZXh0LCBbXCJ3aWRnZXRcIl0pO1xuICAgICAgICAvLyBhZGQgc29tZSBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImNhcHRpb25cIiwgXCJjb2RlXCIsIFwiY29sdW1uaGVhZGVyXCIsICBcImZpZ3VyZVwiLCBcImxpc3RcIiwgXCJsaXN0aXRlbVwiLCBcIm1hdGhcIiwgXCJtZXRlclwiLCBcImNvbHVtbmhlYWRlclwiLCBcInJvd2hlYWRlclwiXSwgcm9sZXMpO1xuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZXMocnVsZUNvbnRleHQsIHJvbGVzKSAhPT0gbnVsbCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtOb2RlKSB7XG4gICAgICAgICAgICAvLyBDb21wbHkgdG8gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgd2lsbCBiZSBkb25lIGJ5IGRlZmF1bHQgYXMgdGhpcyBydWxlIHRyaWdnZXJzIG9uIGVhY2ggZWxlbWVudFxuICAgICAgICAgICAgLy8gYW5kIGZvciBlYWNoIGVsZW1lbnQgaXQgb25seSBjaGVja3MgdGhhdCBzaW5nbGUgZWxlbWVudHMgdGV4dCBub2RlcyBhbmQgbm90aGluZyBlbHNlLiBTbyBhbGwgaW5uZXIgZWxlbWVudHMgd2lsbCBiZVxuICAgICAgICAgICAgLy8gY292ZXJlZCBvbiB0aGVpciBvd24uIEN1cnJlbnRseSBmb3IgdGhpcyBydWxlIGJ5IGRlZmF1bHQgQ2hlY2sgSGlkZGVuIENvbnRlbnQgd2lsbCB3b3JrLCBhcyB3ZSBhcmUgZG9pbmdcbiAgICAgICAgICAgIC8vIGEgbm9kZSB3YWxrIG9ubHkgb24gc2libGluZ3Mgc28gaXQgd291bGQgbm90IGdldCB0ZXh0IG5vZGVzIGZyb20gb3RoZXIgc2libGluZ3MgYXQgYWxsLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgaW4gdGhlIGZ1dHVyZSBzb21ldGhpbmcgY2hhbmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eHRWYWwgPSB3YWxrTm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IGZhaWx1cmUgPSAvXlsgXFx0XFxyXFxuXSpbKCBdKlsxLTldKltcXCpcXC0pLl1bIFxcdF1bQS1aLGEtel0rLy50ZXN0KHR4dFZhbCk7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gIWZhaWx1cmU7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUncyBzb21lIHNvcnQgb2YgYmxvY2sgbGV2ZWwgZWxlbWVudCBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCBmYWlsdXJlcyBkdWUgdG8gdGhpbmdzIGxpa2UgPGk+U29tZSBzZW50ZW5jZTwvaT4uIE5ldyBzZW50ZW5jZS5cbiAgICAgICAgICAgICAgICAgICAgLy9sZXQgbncgPSBuZXcgTm9kZVdhbGtlcih3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIod2Fsa05vZGUpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5wcmV2Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoW1wiYmxvY2txdW90ZVwiLCBcImNlbnRlclwiLCBcImRpclwiLCBcImRpdlwiLCBcImZvcm1cIiwgXCJoMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLCBcImhyXCIsIFwiYnJcIiwgXCJtZW51XCIsIFwicFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicHJlXCJdLmluY2x1ZGVzKG5vZGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eHQgPSBudy5ub2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0eHQubGVuZ3RoID4gMCAmJiAhW1wiIFwiLCBcIlxcdFwiLCBcIlxcblwiXS5pbmNsdWRlcyh0eHQuY2hhckF0KHR4dC5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9saXN0XCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3Rfc3RydWN0dXJlX3Byb3BlclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmRsLCBkb206dWwsIGRvbTpvbCwgZG9tOmRpciwgZG9tOm1lbnUsIGRvbTpsaSwgZG9tOmRkLCBkb206ZHRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X01pc3VzZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJMaXN0IGVsZW1lbnQgaXMgbWlzc2luZyBvciBpbXByb3Blcmx5IHN0cnVjdHVyZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXN0IGVsZW1lbnRzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGxpc3RzIG9mIHJlbGF0ZWQgaXRlbXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgcnVsZUNvbnRleHRcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcnVsZUNvbnRleHQuY2hpbGRyZW5cblxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJkbFwiKSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHdhbGtDaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW5zIHNldCBhcyBwYXNzZWQsIHNpbmNlIGRsIGVsZW1lbnRzIGNhbiBoYXZlXG4gICAgICAgICAgICAvLyB6ZXJvIG9yIG1vcmUgb2Y6IG9uZSBvciBtb3JlIGR0IGVsZW1lbnRzLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkZCBlbGVtZW50c1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa0NoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhbGtDaGlsZHJlbi5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpbGUgd2Fsa2luZyB0aHJvdWdoIHRoZSBlbGVtZW50cyB1bmRlciBkbCwgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBtb3ZlIHRvIHRoZSBuZXh0IGVsZW1lbnQgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdHRpbmcgdGV4dCBub2Rlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHNldCB0byBwYXNzIGlmIHdlIGZpbmQgZGQgb3IgZHQgZWxlbWVudCwgaW4gdGhlIGNhc2Ugb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGVsZW1lbnQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIHdlIHdpbGwgY2F0Y2ggaXQgaGVyZS4gaS5lLiBpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImRkXCIgfHwgbm9kZU5hbWUgPT0gXCJkdFwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGUgZGVwZW5kaW5nIG9uIHdoaWNoIGlzIGZvdW5kIGZpcnN0IGFuZCBsYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gXCJcIikgZmlyc3QgPSBub2RlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBub2RlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBmb3VuZCBkdCBhbmQgZGQgZWxlbWVudHMgdW5kZXIgZGwgd2UgcGFzcyByaWdodCBhd2F5LlxuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gZHQgb3IgZGQgZWxlbWVudCwgYnV0IGJ1bmNoIG9mIHByZXNlbnRhdGlvbmFsIGVsZW1lbnRzIHdlIG1hcmsgdGhpcyBhcyBhXG4gICAgICAgICAgICAgICAgLy8gcGFzcy4gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMsIHN1Y2ggYXMgaW1nIHdlIHdpbGwgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAocGFzc2VkICYmIGZpcnN0ID09IFwiZHRcIiAmJiBsYXN0ID09IFwiZGRcIikgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInVsXCIsIFwib2xcIiwgXCJkaXJcIiwgXCJtZW51XCJdKSAhPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZGRcIiB8fCBub2RlTmFtZSA9PSBcImR0XCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZGxcIikgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICAvLyBaZXJvIG9yIG1vcmUgbGkgZWxlbWVudHMgYXJlIHBlcm1pdHRlZCBpbnNpZGUgb2YgPG9sPiwgPHVsPiBvciA8bWVudT4gZWxlbWVudHMgbm93IGFzIHBlciB0aGUgaHRtbDUgc3BlYy4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGFyZSB6ZXJvIGVsZW1lbnRzIHVuZGVyIHRoZSA8b2w+LCA8dWw+IG9yIDxtZW51Pi5cbiAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIiB8fCBub2RlTmFtZSA9PSBcIm1lbnVcIikgJiYgKCFydWxlQ29udGV4dC5jaGlsZHJlbiB8fCBydWxlQ29udGV4dC5jaGlsZHJlbi5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGlGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgbGlzdCBlbGVtZW50cywgaWYgd2UgZmluZCBhIFxuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25hbCBlbGVtZW50IHdlIHNraXAgY2hlY2tpbmcgYXMgcHJlc2VudGF0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgYXJlIGFsbG93ZWQgdW5kZXIgbGlzdCBlbGVtZW50cyBhcyB0aGV5IGFyZSBvbmx5IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5pc1ByZXNlbnRhdGlvbmFsRWxlbWVudCh3YWxrQ2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25hbEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgbm9kZSB0eXBlIGlzIGFueXRoaW5nIGJ1dCAxLCBvciBpbiB0aGUgY2FzZSB0aGF0IGl0IGlzIGEgbGkgZWxlbWVudC4gRm9yIGFueSBvdGhlciBub2RlIFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIGJlIGNhdWdodCBoZXJlIHRoYXQgZWxlbWVudCBpcyBub3QgYWxsb3dlZCB1bmRlciBsaXN0IG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1cnRoZXJtb3JlIGluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgYSB0ZW1wbGF0ZSBlbGVtZW50IHdpdGggdGhlIHBhcmVudCBiZWluZyB1bC9vbCBkb24ndCBmbGFnIGEgdmlvbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHdhbGtDaGlsZHJlbi5ub2RlVHlwZSAhPSAxIHx8IHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibGlcIiB8fCAod2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJ0ZW1wbGF0ZVwiICYmIChub2RlTmFtZSA9PSBcInVsXCIgfHwgbm9kZU5hbWUgPT0gXCJvbFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGxpIGZvdW5kIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgZWxlbWVudCAobm9kZVR5cGU9MSkgaXMgYW4gbGkgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBsaUZvdW5kID0gbGlGb3VuZCB8fCAod2Fsa0NoaWxkcmVuLm5vZGVUeXBlID09IDEgJiYgd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJsaVwiKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGl0IGhhcyBwYXNzZWQgYW5kIGFsc28gbGkgZWxlbWVudCBpcyBmb3VuZCB1bmRlciBsaXN0IG5vZGUsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGxpIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzLCBzdWNoIGFzIGltZyB3ZSB3aWxsIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKHBhc3NlZCAmJiBsaUZvdW5kKSB8fCAocGFzc2VkICYmIHByZXNlbnRhdGlvbmFsRm91bmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IG1hcnF1ZWVfZWxlbV9hdm9pZDogUnVsZSA9IHtcbiAgICBpZDogXCJtYXJxdWVlX2VsZW1fYXZvaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTptYXJxdWVlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWFycXVlZV9UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtYXJxdWVlX2VsZW1fYXZvaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTY3JvbGxpbmcgY29udGVudCBmb3VuZCB0aGF0IHVzZXMgdGhlIG9ic29sZXRlIDxtYXJxdWVlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxtYXJxdWVlPiBlbGVtZW50IGlzIG9ic29sZXRlIGFuZCBzaG91bGQgbm90IGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hbHRfYnJpZWY6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2JyaWVmXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF0sIGRvbTphcHBsZXRbYWx0XSwgZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF0sIGRvbTppbnB1dFt0eXBlXVthbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfQWx0QnJpZWZcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGV4dCBhbHRlcm5hdGl2ZSBpcyBtb3JlIHRoYW4gMTUwIGNoYXJhY3RlcnNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbHRlcm5hdGl2ZSB0ZXh0IGluICdhbHQnIGF0dHJpYnV0ZSBzaG91bGQgYmUgYnJpZWYgKDwxNTAgY2hhcmFjdGVycylcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBtYXhBbHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTUwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgYWx0TGVuZ3RoID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLnRyaW0oKS5sZW5ndGg7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhbHRMZW5ndGggPD0gdmFsaWRhdGVQYXJhbXMubWF4QWx0LnZhbHVlO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFyZWFbYWx0XSwgZG9tOmVtYmVkW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1ZpZGVvQWx0RmlsZW5hbWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYWx0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiRmlsZW5hbWUgdXNlZCBhcyBsYWJlbCBmb3IgZW1iZWRkZWQgYXVkaW8gb3IgdmlkZW9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBvciB2aWRlbyBvbiB0aGUgcGFnZSBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZSBtZWRpYSBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB1cmkgPSBcIlwiO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFyZWFcIikge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJpID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB1cmkgPSBcIlwiO1xuICAgICAgICBsZXQgZXh0ID0gQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHVyaSk7XG4gICAgICAgIGxldCBpc0F1ZFZpZCA9IGV4dC5sZW5ndGggIT0gMCAmJiAoQ29tbW9uVXRpbC5pc0F1ZGlvRXh0KGV4dCkgfHwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0KGV4dCkpO1xuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFpc0F1ZFZpZCB8fCAoYWx0VGV4dC5sZW5ndGggPiAwICYmIGFsdFRleHQuaW5kZXhPZihleHQpID09IC0xKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYXVkaW9fdHJhbnNjcmliZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpiZ3NvdW5kLCBkb206YVtocmVmXSwgZG9tOmFyZWFbaHJlZl0sIGRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0F1ZGlvVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfYXVkaW9fdHJhbnNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJQcm92aWRlIHRyYW5zY3JpcHRzIGZvciBhdWRpbyBmaWxlc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkF1ZGlvIGluZm9ybWF0aW9uIHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBpbiB0ZXh0IGZvcm1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGxldCB0aGlzTm9kZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICh0aGlzTm9kZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc0F1ZGlvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDsgLy8gT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpwYXJhbVtuYW1lPWF1dG9wbGF5XSwgZG9tOnBhcmFtW25hbWU9YXV0b3N0YXJ0XSwgZG9tOmVtYmVkW2ZsYXNodmFyc10sIGRvbTplbWJlZFtzcmNdLCBkb206KlthdXRvc3RhcnQ9dHJ1ZV0sIGRvbToqW2F1dG9zdGFydD0xXSwgZG9tOmJnc291bmRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbWJlZF9BdXRvU3RhcnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgbWVjaGFuaXNtIHRvIHBhdXNlIG9yIHN0b3AgYW5kIGNvbnRyb2wgdGhlIHZvbHVtZSBmb3IgdGhlIGF1ZGlvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lY2hhbmlzbSBtdXN0IGJlIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgb2YgdGhlIGF1ZGlvIHRoYXQgcGxheXMgYXV0b21hdGljYWxseVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiYmdzb3VuZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcInBhcmFtXCIpIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSlcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRlbnQuaW5kZXhPZihcIjA7XCIpID09IDAgfHxcbiAgICAgICAgICAgICAgICAhKGNvbnRlbnQuaW5kZXhPZihcInRydWVcIikgIT0gLTEgfHwgY29udGVudC5pbmRleE9mKFwiMVwiKSAhPSAtMSk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImZsYXNodmFyc1wiKSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIik7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9dHJ1ZVwiKSA9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBzdHIuaW5kZXhPZihcImF1dG9zdGFydD0xXCIpID09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzcmNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImF1dG9zdGFydFwiKSkge1xuICAgICAgICAgICAgbGV0IHZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImF1dG9zdGFydFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gdmFsICE9ICd0cnVlJyAmJiB2YWwgIT0gJzEnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YXVkaW8sIGRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BdWRpb19WaWRlb19UcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBtZWRpYSB1c2luZyA8YXVkaW8+IGFuZC9vciA8dmlkZW8+IGVsZW1lbnRzIGhhdmUga2V5Ym9hcmQgYWNjZXNzaWJsZSBjb250cm9sc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk1lZGlhIHVzaW5nIDxhdWRpbz4gYW5kL29yIDx2aWRlbz4gZWxlbWVudHMgbXVzdCBoYXZlIGtleWJvYXJkIGFjY2Vzc2libGUgY29udHJvbHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImF1ZGlvXCIgfHwgbm9kZU5hbWUgPT09IFwidmlkZW9cIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfbGl2ZV9jYXB0aW9uZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZCwgZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX1ZpZGVvT2JqZWN0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwibWVkaWFfbGl2ZV9jYXB0aW9uZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgY2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBsaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJMaXZlIG1lZGlhIChzdHJlYW1pbmcgdmlkZW8gd2l0aCBhdWRpbykgc2hvdWxkIGhhdmUgY2FwdGlvbnMgZm9yIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfdHJhY2tfYXZhaWxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206YXBwbGV0LCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9WaWRlb1JlZmVyZW5jZVRyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfdHJhY2tfYXZhaWxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgYXZhaWxhYmlsaXR5IG9mIGEgdXNlci1zZWxlY3RhYmxlIGF1ZGlvIHRyYWNrIHdpdGggZGVzY3JpcHRpb24gb2YgdmlzdWFsIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcmUtcmVjb3JkZWQgbWVkaWEgc2hvdWxkIGhhdmUgYW4gYXVkaW8gdHJhY2sgdGhhdCBkZXNjcmliZXMgdmlzdWFsIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuM1wiLCBcIjEuMi41XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImFwcGxldFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhc3NlZCA9ICFDb21tb25VdGlsLmlzVmlkZW9PYmpFbWJlZExpbmsocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgbWV0YV9yZWRpcmVjdF9vcHRpb25hbDogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsXCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX01ldGFfUmVkaXJlY3RaZXJvXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcImZhaWxfbG9uZ3JlZnJlc2hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2Ugc2hvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbiB0byB0dXJuIGl0IG9mZiBvciBhZGp1c3QgdGhlIHRpbWUgbGltaXRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiQ2hlY2sgcGFnZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIC8vIFJlbW92ZWQgQUNUIGJpc3o1OCBBQUFcbiAgICBhY3Q6IFt7IFxuICAgICAgICBcImJjNjU5YVwiIDoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwicGFzc1wiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImh0dHAtZXF1aXZcIikudG9Mb3dlckNhc2UoKSAhPT0gJ3JlZnJlc2gnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBJbnZhbGlkIGNvbnRlbnQgZmllbGRcbiAgICAgICAgaWYgKCFjb250ZW50Lm1hdGNoKC9eXFxkKyQvKSAmJiAhY29udGVudC5tYXRjaCgvXlxcZCs7LykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgY2hlY2sgdGhlIGZpcnN0IG9uZSBzaW5jZSBpdCB0YWtlcyBwcmlvcml0eVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC50cmlnZ2VyT25jZShGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCksIFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbFwiLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0aW1lTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eKFxcZCspOyArW14gXS8pO1xuICAgICAgICBpZiAoIXRpbWVNYXRjaCB8fCBwYXJzZUludCh0aW1lTWF0Y2hbMV0pID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSBwYXJzZUludCh0aW1lTWF0Y2hbMV0pO1xuICAgICAgICAgICAgaWYgKHRpbWUgPCA3MjAwMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbG9uZ3JlZnJlc2hcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IG1ldGFfcmVmcmVzaF9kZWxheTogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZnJlc2hfZGVsYXlcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW2h0dHAtZXF1aXZdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWV0YV9SZWZyZXNoXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBzaG91bGQgbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBwYWdlIGlzIG5vdCBiZWluZyBjYXVzZWQgdG8gcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbIFwiYmlzejU4XCIsIFwiYmM2NTlhXCIgXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gSW52YWxpZCBjb250ZW50IGZpZWxkXG4gICAgICAgIGlmICghY29udGVudC5tYXRjaCgvXlxcZCskLykgJiYgIWNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmFpbCA9ICFjb250ZW50Lm1hdGNoKC9eXFxkKzsgK1teIF0vKTtcbiAgICAgICAgcmV0dXJuICFmYWlsID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3ZpZXdwb3J0X3pvb21hYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW25hbWVdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJtZXRhX3ZpZXdwb3J0X3pvb21cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3pvb21hYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfem9vbWFibGVcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIHNob3VsZCBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIGRvZXMgbm90IHByZXZlbnQgdGhlIGJyb3dzZXIgem9vbWluZyB0aGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfem9vbWFibGVcIjogXCJDb25maXJtIHRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgd2l0aCBcXFwiezB9XFxcIiBjYW4gYmUgem9vbWVkIGJ5IHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI0ZjBjM1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm5hbWVcIikudG9Mb3dlckNhc2UoKSAhPT0gJ3ZpZXdwb3J0JylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBuZWl0aGVyIG1heGltdW0tc2NhbGUgbm9yIHVzZXItc2NhbGFibGUgKGRlZmF1bHQgeWVzKVxuICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkgPT09ICcnIHx8ICghY29udGVudC5pbmNsdWRlcygnbWF4aW11bS1zY2FsZScpICYmICFjb250ZW50LmluY2x1ZGVzKCd1c2VyLXNjYWxhYmxlJykpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHVzZXJfbXNnID0gbnVsbDtcbiAgICAgICAgbGV0IG1heF9tc2cgPSBudWxsO1xuICAgICAgICBjb25zdCBwcm9wcyA9IGNvbnRlbnQuc3BsaXQoXCIsXCIpO1xuICAgICAgICBsZXQgdXNlcl9zY2FsZV92YWx1ZSA9ICd5ZXMnO1xuICAgICAgICBsZXQgbWF4aW11bV9zY2FsZV92YWx1ZSA9ICcyLjAnO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpZWNlcyA9IHByb3AudHJpbSgpLnNwbGl0KCc9Jyk7XG4gICAgICAgICAgICBpZiAocGllY2VzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5jbHVkZXMoJ3VzZXItc2NhbGFibGUnKSkge1xuICAgICAgICAgICAgICAgIHVzZXJfbXNnID0gcHJvcDtcbiAgICAgICAgICAgICAgICB1c2VyX3NjYWxlX3ZhbHVlID0gcGllY2VzWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodXNlcl9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSB8fCB1c2VyX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcl9zY2FsZV92YWx1ZSA9IHVzZXJfc2NhbGVfdmFsdWUuc3Vic3RyaW5nKDEsIHVzZXJfc2NhbGVfdmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wLmluY2x1ZGVzKCdtYXhpbXVtLXNjYWxlJykpIHtcbiAgICAgICAgICAgICAgICBtYXhfbXNnID0gcHJvcDtcbiAgICAgICAgICAgICAgICBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gcGllY2VzWzFdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAobWF4aW11bV9zY2FsZV92YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSB8fCBtYXhpbXVtX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bV9zY2FsZV92YWx1ZSA9IG1heGltdW1fc2NhbGVfdmFsdWUuc3Vic3RyaW5nKDEsIG1heGltdW1fc2NhbGVfdmFsdWUubGVuZ3RoIC0gMSkudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IE51bWJlcih1c2VyX3NjYWxlX3ZhbHVlKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAxIHx8IHZhbHVlIDw9IC0xKSB1c2VyX3NjYWxlX3ZhbHVlID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWF4aW11bV9zY2FsZSA9IDIuMDtcbiAgICAgICAgdmFsdWUgPSBOdW1iZXIobWF4aW11bV9zY2FsZV92YWx1ZSk7XG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPCAwKSBtYXhpbXVtX3NjYWxlID0gMi4wO1xuICAgICAgICAgICAgZWxzZSBtYXhpbXVtX3NjYWxlID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobWF4aW11bV9zY2FsZV92YWx1ZSA9PT0gJ3llcycpIG1heGltdW1fc2NhbGUgPSAxLjA7XG4gICAgICAgICAgICBlbHNlIG1heGltdW1fc2NhbGUgPSAwLjE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1c2VyLXNjYWxhYmxlIGlzIG5vdCBzZXQgdG8gJ3llcycsIGlnbm9yZSBtYXhpbXVtX3NjYWxlXG4gICAgICAgIGlmICh1c2VyX3NjYWxlX3ZhbHVlICE9PSAneWVzJykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfem9vbWFibGVcIiwgW3VzZXJfbXNnXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlci1zY2FsYWJsZSBpcyAneWVzJywgYnV0IG1heGltdW1fc2NhbGUgaXMgdG9vIHNtYWxsXG4gICAgICAgIGlmIChtYXhpbXVtX3NjYWxlIDwgMi4wKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF96b29tYWJsZVwiLCBbbWF4X21zZ10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG5vZW1iZWRfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibm9lbWJlZF9jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm5vZW1iZWRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfTm9lbWJlZF9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJub2VtYmVkX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJub2VtYmVkX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJub2VtYmVkX2NvbnRlbnRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJBZGQgZGVzY3JpcHRpdmUgdGV4dCB0byB0aGUgPG5vZW1iZWQ+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8bm9lbWJlZD4gZWxlbWVudHMgc2hvdWxkIGNvbnRhaW4gZGVzY3JpcHRpdmUgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG9iamVjdF90ZXh0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJvYmplY3RfdGV4dF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9PYmplY3RfSGFzVGV4dFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGV4dF9hbHRlcm5hdGl2ZVwiOiBcIm9iamVjdF90ZXh0X2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPG9iamVjdD4gZWxlbWVudCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlIGZvciB0aGUgY29udGVudCByZW5kZXJlZCBieSB0aGUgb2JqZWN0XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCI8b2JqZWN0PiBlbGVtZW50IGhhcyBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwiQW4gPG9iamVjdD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI4ZmMzYjZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhpcyBvYmplY3QgaXMgb2YgdHlwZSB0ZXh0LCBieSBjaGVja2luZyB0aGUgb2JqZWN0IHR5cGUgaW4gdGhlIGNhc2UgaXQgaXMgdGV4dCB0aGVuIGRvIG5vdCB0cmlnZ2VyIHRoaXMgcnVsZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkuaW5kZXhPZihcInRleHRcIikgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkOiBpbmNsdWRpbmcgJ3ByZXNlbnRhdGlvbicsICdub25lJywgJ2FwcGxpY2F0aW9uJywgJ2RvY3VtZW50JyBvciAnaW1nJ1xuICAgICAgICAvLyB0aGlzIGNhc2Ugd2lsbCBiZSBjb3ZlcmVkIGluIG90aGVyIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyIEFDVCwgaWdub3JlIGVtYmVkZGVkIEhUTUwgZmlsZXNcbiAgICAgICAgbGV0IGRhdGEgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkYXRhXCIpO1xuICAgICAgICBsZXQgZXh0ID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gdHlwZW9mIFwiXCIgPyBkYXRhLnN1YnN0cmluZyhkYXRhLmxhc3RJbmRleE9mKFwiLlwiKSkgOiBcIlwiO1xuICAgICAgICBpZiAoZXh0ID09PSBcIi5odG1sXCIgfHwgZXh0ID09PSBcIi5odG1cIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBjb25zdCBwYXNzZWQgPSBwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIC8vbGV0IHBhc3NlZCA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFuY2VzdG9yVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3RvclwiO1xuXG5leHBvcnQgY29uc3QgcGFnZV90aXRsZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwicGFnZV90aXRsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpodG1sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRG9jX0hhc1RpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgcGFnZSBzaG91bGQgaGF2ZSBhIHRpdGxlIHRoYXQgY29ycmVjdGx5IGlkZW50aWZpZXMgdGhlIHN1YmplY3Qgb2YgdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTWlzc2luZyA8aGVhZD4gZWxlbWVudCBzbyB0aGVyZSBjYW4gYmUgbm8gPHRpdGxlPiBlbGVtZW50IHByZXNlbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTWlzc2luZyA8dGl0bGU+IGVsZW1lbnQgaW4gPGhlYWQ+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiVGhlIDx0aXRsZT4gZWxlbWVudCBpcyBlbXB0eSAobm8gaW5uZXJIVE1MKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCIyNzc5YTVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBpbnNpZGUgYSBwcmVzZW50YXRpb25hbCBmcmFtZVxuICAgICAgICBpZiAoQW5jZXN0b3JVdGlsLmlzRnJhbWUoY29udGV4dEhpZXJhcmNoaWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgTm9kZTtcbiAgICAgICAgLy8gRmlyc3QsIGZpbmQgdGhlIGhlYWQgZWxlbWVudFxuICAgICAgICBsZXQgZmluZEhlYWQgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIGxldCBmaW5kVGl0bGUgPSBudWxsO1xuICAgICAgICB3aGlsZSAoZmluZEhlYWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGZpbmRIZWFkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJoZWFkXCIpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBmaW5kSGVhZCA9IGZpbmRIZWFkLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3NzaWJsZVRpdGxlcyA9IChydWxlQ29udGV4dCBhcyBFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKFwidGl0bGVcIik7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHBvc3NpYmxlVGl0bGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcihwb3NzaWJsZVRpdGxlc1tpZHhdLCBbXCJzdmdcIl0pKSB7XG4gICAgICAgICAgICAgICAgZmluZFRpdGxlID0gcG9zc2libGVUaXRsZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmluZEhlYWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghZmluZFRpdGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbmRUaXRsZSA9PT0gbnVsbCkgeyAvLyBkb24ndCBoYXZlIHRpdGxlIHNlY29uZCBQb0ZcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIGdldCBoZXJlIHdlIGhhdmUgPGhlYWQ+IGFuZCA8dGl0bGU+XG5cbiAgICAgICAgaWYgKGZpbmRUaXRsZSAhPSBudWxsICYmIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGZpbmRUaXRsZSkudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gPHRpdGxlPiBoYXMgbm8gaW5uZXJIVE1MIHRoaXJkIFBvRlxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgcGFnZV90aXRsZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJwYWdlX3RpdGxlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aGVhZCBkb206dGl0bGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9UaXRsZV9WYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJQb3RlbnRpYWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMVwiOiBcInBhZ2VfdGl0bGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcInBhZ2VfdGl0bGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInBhZ2VfdGl0bGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzFcIjogXCJQYWdlIDx0aXRsZT4gaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJWZXJpZnkgdGhhdCB1c2luZyB0aGUgZmlsZW5hbWUgYXMgdGhlIHBhZ2UgPHRpdGxlPiB2YWx1ZSBpcyBkZXNjcmlwdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2UgPHRpdGxlPiBzaG91bGQgYmUgYSBkZXNjcmlwdGl2ZSB0aXRsZSwgcmF0aGVyIHRoYW4gYSBmaWxlbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICBsZXQgdGl0bGVTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpO1xuXG4gICAgICAgIC8vIGFsbG93IC5jb20sIC5uZXQgYW5kIC5vcmdcbiAgICAgICAgbGV0IHRpdGxlU3RyTG93ZXJjYXNlID0gdGl0bGVTdHIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLmNvbVwiKSB8fCB0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5uZXRcIikgfHwgdGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIub3JnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW3RpdGxlU3RyXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGl0bGVTdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGNvdmVyZWQgYnkgcGFnZV90aXRsZV9leGlzdHNcbiAgICAgICAgICAgIHJldHVybiBudWxsOy8vUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gIS9eXFxTKlxcLlthLXpBLVpdezEsNH0oPyEuKXxeaHR0cHM/OlxcL1xcL1xcUyovaS50ZXN0KHRpdGxlU3RyKTtcblxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW3RpdGxlU3RyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHNjcmlwdF9mb2N1c19ibHVyX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uZm9jdXNdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2NyaXB0X0ZvY3VzQmx1cnNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHNjcmlwdCBkb2VzIG5vdCByZW1vdmUgZm9jdXMgZnJvbSBjb250ZW50IHRoYXQgbm9ybWFsbHkgcmVjZWl2ZXMgZm9jdXNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTY3JpcHRpbmcgbXVzdCBub3QgcmVtb3ZlIGZvY3VzIGZyb20gY29udGVudCB0aGF0IG5vcm1hbGx5IHJlY2VpdmVzIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiLCBcIjIuNC43XCIsIFwiMy4yLjFcIl0sIC8vbWF0Y2ggcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBoZWxwXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm9uZm9jdXNcIikuaW5kZXhPZihcIi5ibHVyKFwiKSA9PSAtMTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHNjcmlwdF9vbmNsaWNrX2F2b2lkOiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkXCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmNsaWNrXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wic2NyaXB0X29uY2xpY2tfbWlzdXNlXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1NjcmlwdF9PbmNsaWNrSFRNTDJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgJ29uY2xpY2snIGV2ZW50cyBhcmUgbm90IHVzZWQgaW4gc2NyaXB0IHRvIGVtdWxhdGUgYSBsaW5rXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0cyBzaG91bGQgbm90IGJlIHVzZWQgdG8gZW11bGF0ZSBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sIC8vaGVscCBhbmQgbWF0Y2ggbWFwcGluZyB0byAyLjEuMSBvbmx5IFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgdGhpcyBmb3IgU1ZHIGVsZW1lbnQgZm9yIG5vdyB1bnRpbCBhIGRldGVybWluYXRpb24gaXMgbWFkZSAoYnkgUmljaClcbiAgICAgICAgLy8gdG8gc3VwcG9ydCBTVkcgYXQgYSBwb2ludCB3aGVuIHRoZSBTVkcgYTExeSBzcGVjIGlzIHJlYWR5LlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGFyaWEtcm9sZSBzcGVjaWZpZWQsIGRvbid0IHRyaWdnZXIgdGhpcy5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicm9sZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJhcmVhXCIgfHwgbm9kZU5hbWUgPT0gXCJpbnB1dFwiO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0X29uY2xpY2tfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25jbGlja11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TY3JpcHRfT25jbGlja0hUTUwxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvc3NpYmxlIHVzZSBvZiBhIHNjcmlwdCB0byBlbXVsYXRlIGEgbGlua1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdHMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGVtdWxhdGUgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLCAvL2hlbHAgYW5kIG1hdGNoIG1hcHBpbmcgdG8gMi4xLjEgb25seSBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGZhaWxTdWJzdHJpbmc6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wiLmFzcFwiLCBcIi5hc3B4XCIsIFwiLmNmbVwiLCBcIi5jZm1sXCIsIFwiLmNnaVwiLCBcIi5odG1cIiwgXCIuaHRtbFwiLCBcIi5zaHRtXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiLnNodG1sXCIsIFwiLnBocFwiLCBcIi5wbFwiLCBcIi5weVwiLCBcIi5zaHRtXCIsIFwiLnNodG1sXCIsIFwiLnhodG1sXCIsXG4gICAgICAgICAgICAgICAgICAgIFwibG9jYXRpb24uaHJlZlwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBhcmlhLXJvbGUgc3BlY2lmaWVkLCBkb24ndCB0cmlnZ2VyIHRoaXMuXG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInJvbGVcIik7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gYSBvciBhcmVhLCBkb24ndCB0cmlnZ2VyIGlmIHRoZXJlJ3MgYW4gaHJlZi5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8ICgobm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJhcmVhXCIpICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiaHJlZlwiKSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGd1YXJkcyBmYWlsZWQsIGNoZWNrIHRvIHNlZSBpZiB0aGV5J3JlIGxvb2tpbmcgYXQgbGlua3NcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCBmYWlsU3Vic3RyaW5nID0gdmFsaWRhdGVQYXJhbXMuZmFpbFN1YnN0cmluZy52YWx1ZTs7XG4gICAgICAgICAgICBsZXQgb25jbGljayA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcIm9uY2xpY2tcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBmYWlsU3Vic3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gb25jbGljay5pbmRleE9mKGZhaWxTdWJzdHJpbmdbaV0pID09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0X3NlbGVjdF9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpzZWxlY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TZWxlY3RfTm9DaGFuZ2VBY3Rpb25cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgbm8gY2hhbmdlIG9mIGNvbnRleHQgb3IgYWN0aW9uIG9jY3VycyB3aGVuIHNlbGVjdGlvbiBvcHRpb25zIGluIHRoaXMgY29tcG9uZW50IHJlY2VpdmUgZm9jdXNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJObyBjaGFuZ2VzIG9mIGNvbnRleHQgc2hvdWxkIG9jY3VyIHdoZW4gYSBzZWxlY3Rpb24gdmFsdWUgcmVjZWl2ZXMgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9ICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdF9vcHRpb25zX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2VsZWN0X29wdGlvbnNfZ3JvdXBlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NlbGVjdF9IYXNPcHRHcm91cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJHcm91cCBvZiByZWxhdGVkIG9wdGlvbnMgbWF5IG5lZWQgPG9wdGdyb3VwPlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkdyb3VwcyBvZiByZWxhdGVkIG9wdGlvbnMgd2l0aGluIGEgc2VsZWN0aW9uIGxpc3Qgc2hvdWxkIGJlIGdyb3VwZWQgd2l0aCA8b3B0Z3JvdXA+XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbU51bU9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMTAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2VzIHdoZXJlIG9wdGdyb3VwIGlzIGhpZGRlbiwgd2hpY2ggc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb25zXG4gICAgICAgIC8vIGJ1dCBpbiB0aGUgY2FzZSB0aGF0IENoZWNrIGhpZGRlbiBvcHRpb24gaXMgc2V0IHRoZW4gc2hvdWxkIG5vdCB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHJ1bGVDb250ZXh0LCBcIm9wdGdyb3VwXCIsIGZhbHNlLCB0cnVlKS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwib3B0aW9uXCIsIGZhbHNlLCB0cnVlKS5sZW5ndGggPD1cbiAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1zLnBhcmFtTnVtT3B0aW9ucy52YWx1ZTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHNraXBfbWFpbl9kZXNjcmliZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2tpcF9tYWluX2Rlc2NyaWJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHlcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcInNraXBfbWFpbl9leGlzdHNcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQm9keV9GaXJzdEFDb250YWluc1NraXBUZXh0X05hdGl2ZV9Ib3N0X1NlbWF0aWNzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJza2lwX21haW5fZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJza2lwX21haW5fZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJza2lwX21haW5fZGVzY3JpYmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBpZiB0aGlzIGh5cGVybGluayBza2lwcyBjb250ZW50LCB0aGUgZGVzY3JpcHRpb24gY29tbXVuaWNhdGVzIHdoZXJlIGl0IGxpbmtzIHRvXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGRlc2NyaXB0aW9uIG9mIGEgaHlwZXJsaW5rIHVzZWQgdG8gc2tpcCBjb250ZW50IG11c3QgY29tbXVuaWNhdGUgd2hlcmUgaXQgbGlua3MgdG9cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbVNraXBUZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInNraXBcIiwgXCJqdW1wXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEdldCB0aGUgYW5jaG9ycyBvbiB0aGUgcGFnZVxuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcblxuICAgICAgICAvLyBDaGVjayBmb3IgbGFuZG1hcmtzIGZpcnN0XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBbXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwic2VhcmNoXCJcbiAgICAgICAgICAgIF0sIHRydWUsIHRydWUpLmxlbmd0aCA+IDApO1xuICAgICAgICB9XG4gICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIGZhbHNlKTtcblxuICAgICAgICBpZiAoIXBhc3NlZCkgeyAvLyBObyBsYW5kbWFya3MsIGNoZWNrIGZvciBza2lwIGxpbmtzXG4gICAgICAgICAgICBsZXQgbGlua3MgPSBkb2MubGlua3M7XG4gICAgICAgICAgICAvLyBTa2lwIGxpbmsgc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUgb24gdGhlIHBhZ2Ugd2l0aCBhbiBocmVmIGF0dHJpYnV0ZSAoaS5lLiwgbGlua3NbMF0pXG4gICAgICAgICAgICAvLyBhbHNvIGlmIHRoZSBmaXJzdCBsaW5rIGlzIGhpZGRlbiB0aGVuIHdlIHNob3VsZCBhbHNvIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICBpZiAobGlua3MgJiYgbGlua3MubGVuZ3RoID4gMCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobGlua3NbMF0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZG9jLmxpbmtzWzBdKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCB2YWxpZGF0ZVBhcmFtcy5wYXJhbVNraXBUZXh0LnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRlc3RUZXh0LmluZGV4T2YodmFsaWRhdGVQYXJhbXMucGFyYW1Ta2lwVGV4dC52YWx1ZVtpXSkgIT0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHBhc3NlZCA9IGZhbHNlO1xuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHNraXBfbWFpbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2tpcF9tYWluX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHlcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Cb2R5X0ZpcnN0QVNraXBzX05hdGl2ZV9Ib3N0X1NlbWF0aWNzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInNraXBfbWFpbl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNraXBfbWFpbl9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgcGFnZSBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIHF1aWNrbHkgbmF2aWdhdGUgdG8gdGhlIG1haW4gY29udGVudCAoQVJJQSBcXFwibWFpblxcXCIgbGFuZG1hcmsgb3IgYSBza2lwIGxpbmspXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZXMgbXVzdCBwcm92aWRlIGEgd2F5IHRvIHNraXAgZGlyZWN0bHkgdG8gdGhlIG1haW4gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEdldCB0aGUgYW5jaG9ycyBvbiB0aGUgcGFnZVxuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcblxuICAgICAgICAvLyBDaGVjayBmb3IgbGFuZG1hcmtzIGZpcnN0XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBbXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwic2VhcmNoXCJcbiAgICAgICAgICAgIF0sIHRydWUsIHRydWUpLmxlbmd0aCA+IDApO1xuICAgICAgICB9XG4gICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIGZhbHNlKTtcblxuICAgICAgICBpZiAoIXBhc3NlZCkgeyAvLyBObyBsYW5kbWFya3MsIGNoZWNrIGZvciBza2lwIGxpbmtzXG4gICAgICAgICAgICBsZXQgYW5jaG9ycyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJhXCIpO1xuXG4gICAgICAgICAgICAvLyBTa2lwIGFuY2hvciBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZSBvbiB0aGUgcGFnZSB3aXRoIGFuIGhyZWYgYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgdGVzdEFuY2hvciA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuY2hvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yc1tpXS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShhbmNob3JzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0QW5jaG9yID0gYW5jaG9yc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQdWxsIG91dCB0aGUgdGFyZ2V0IGlkXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRlc3RBbmNob3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBocmVmU3RyID0gdGVzdEFuY2hvci5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgICAgIGxldCBpZHggPSBocmVmU3RyLmluZGV4T2YoXCIjXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpZHggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SWQgPSBocmVmU3RyLnN1YnN0cmluZyhpZHggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgYW4gZWxlbWVudCBpZCBvciBuYW1lZCBhbmNob3Igb24gdGhlIHBhZ2Ugd2l0aCB0aGlzXG4gICAgICAgICAgICAvLyB0YXJnZXQgaWQuXG5cbiAgICAgICAgICAgIGlmICh0YXJnZXRJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZG9jLmdldEVsZW1lbnRCeUlkKHRhcmdldElkKSAhPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCBhbmNob3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYW5jaG9yc1tpXS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcnNbaV0uZ2V0QXR0cmlidXRlKFwibmFtZVwiKSA9PSB0YXJnZXRJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9CYWNrZ3JvdW5kSW1hZ2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZSBDU1MgYmFja2dyb3VuZCBpbWFnZSBkb2VzIG5vdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW1hZ2VzIGluY2x1ZGVkIGJ5IHVzaW5nIENTUyBhbG9uZSBtdXN0IG5vdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImxpbmtcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIikge1xuICAgICAgICAgICAgLy8gRXh0ZXJuYWwgc3R5bGVzaGVldCAtIHRyaWdnZXJcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwudHJpZ2dlck9uY2UocnVsZUNvbnRleHQsIFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCIsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkICYmIG5vZGVOYW1lID09PSBcInN0eWxlXCIgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgIGxldCBzdHlsZVRleHQ7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICBzdHlsZVRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgICAgICBsZXQgYmdNYXRjaGVzID0gc3R5bGVUZXh0Lm1hdGNoKC9iYWNrZ3JvdW5kOlteO10qL2cpO1xuICAgICAgICAgICAgaWYgKGJnTWF0Y2hlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGJnTWF0Y2hlcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gYmdNYXRjaGVzW2ldLmluZGV4T2YoXCJ1cmwoXCIpID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIlxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5cbi8qKlxuICogRGVzY3JpcHRpb246IFRyaWdnZXIgaWYgOmJlZm9yZSBhbmQgOmFmdGVyIGFyZSB1c2VkIGluIENTUyAoSW50ZXJuYWwgYW5kIEV4dGVybmFsKSB3aXRoIGNvbnRlbnRcbiAqIE9yaWdpbjogV0NBRyAyLjAgRjg3XG4gKi9cbmV4cG9ydCBjb25zdCBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTpzdHlsZSwgZG9tOmxpbmtcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TdHlsZV9CZWZvcmVBZnRlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRG8gbm90IHVzZSBDU1MgJzo6YmVmb3JlJyBhbmQgJzo6YWZ0ZXInIHBzZXVkby1lbGVtZW50cyB0byBpbnNlcnQgbm9uLWRlY29yYXRpdmUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGUgJzo6YmVmb3JlJyBhbmQgJzo6YWZ0ZXInIHBzZXVkby1lbGVtZW50cyBkbyBub3QgaW5zZXJ0IG5vbi1kZWNvcmF0aXZlIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgLy8gVHVybiBvZmYgdGhlIHJ1bGUgZHVlIHRvIHRoZSBvYnNvbGV0ZSByZXF1aXJlbWVudFxuICAgICAgICAvL2lkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIGlkOiBbXSxcbiAgICAgICAgbnVtOiBcIjEuMy4xXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvL2NoZWNrIEludGVybmFsIHN0eWxlcyAgICAgICAgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIGxldCBjc3MgPSBDU1NVdGlsLmdldENTU1N0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNzcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgYmFkIENTU1xuICAgICAgICAgICAgICAgIGlmIChjc3NbaV0uc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKGNzc1tpXS5zZWxlY3Rvci5pbmRleE9mKFwiOmJlZm9yZVwiKSA9PT0gLTEgJiYgY3NzW2ldLnNlbGVjdG9yLmluZGV4T2YoXCI6YWZ0ZXJcIikgPT09IC0xKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIShcImNvbnRlbnRcIiBpbiBjc3NbaV0udmFsdWVzKSB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkubGVuZ3RoID09PSAwIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJcXFwiXFxcIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiXFwnXFwnXCIgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIm5vbmVcIiB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiYXR0cih4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwiYXR0cih5KVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgc3BlY2lhbCBydWxlcyBpbiB0aGUgc3R5bGVzaGVldHNcbiAgICAgICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgcGFzc2VkICYmIHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgQG1lZGlhIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjaGVjayAnaWYgKHN0eWxlUnVsZSBpbnN0YW5jZW9mIENTU01lZGlhUnVsZSknIGRvZXNuJ3Qgd29yayB3aGVuIHJ1biBpbiBLYXJtYShidXQgd29ya3MgaW4gREFQKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGxldCdzIGFjY2VzcyB0aGUgdHlwZSBkaXJlY3RseSBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZUltcG9ydFJ1bGU6IENTU0ltcG9ydFJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlLnR5cGUgJiYgc3R5bGVSdWxlLnR5cGUgPT09IDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlTWVkaWFSdWxlID0gc3R5bGVSdWxlIGFzIENTU01lZGlhUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVkaWFSdWxlcyA9IHN0eWxlTWVkaWFSdWxlLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYVJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBtZWRpYVJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbckluZGV4XSBhcyBhbnk7IC8vIHNlbGVjdG9yVGV4dCBub3QgcmVjb2duaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiBtUnVsZS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGUuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBtUnVsZS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0IHJ1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChzdHlsZUltcG9ydFJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTSW1wb3J0UnVsZSkuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRlZFJ1bGUgPSBydWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgQG1lZGlhIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydGVkUnVsZS50eXBlICYmIGltcG9ydGVkUnVsZS50eXBlID09PSA0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gKGltcG9ydGVkUnVsZSBhcyBDU1NNZWRpYVJ1bGUpLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYVJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG1JbmRleCA9IDA7IG1JbmRleCA8IG1lZGlhUnVsZXMubGVuZ3RoOyBtSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1ttSW5kZXhdIGFzIGFueTsgLy8gc2VsZWN0b3JUZXh0IG5vdCByZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG1SdWxlLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiAoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgYm90aCBzaW5nbGUgY29sb24gKDopIGFuZCBkb3VibGUgY29sb24gKDo6KSBwc2V1ZG8gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgZXh0ZXJuYWwgc3R5bGVzIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsaW5rXCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKS50cmltKCkubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZUZyb21MaW5rID0gcnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgQG1lZGlhIHJ1bGVzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUZyb21MaW5rLnR5cGUgJiYgcnVsZUZyb21MaW5rLnR5cGUgPT09IDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVkaWFSdWxlcyA9IChydWxlRnJvbUxpbmsgYXMgQ1NTTWVkaWFSdWxlKS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYVJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbUluZGV4ID0gMDsgcGFzc2VkICYmIG1JbmRleCA8IG1lZGlhUnVsZXMubGVuZ3RoOyBtSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW21JbmRleF0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZVNlbFR4dCA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVTZWxUeHQuaW5kZXhPZihcIjpiZWZvcmVcIikgIT09IC0xIHx8IHJ1bGVTZWxUeHQuaW5kZXhPZihcIjphZnRlclwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG1SdWxlLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHJ1bGVzW3JJbmRleF0gYXMgYW55KS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgKHJ1bGVzW3JJbmRleF0gYXMgYW55KS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSAocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IGJvdGggc2luZ2xlIGNvbG9uICg6KSBhbmQgZG91YmxlIGNvbG9uICg6OikgcHNldWRvICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gKHJ1bGVzW3JJbmRleF0gYXMgYW55KS5zdHlsZVsnY29udGVudCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiXFwnXFwnXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHkpXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfY29sb3JfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2NvbG9yX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbTpmb250W2NvbG9yXSwgZG9tOmxpbmtcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9Db2xvclNlbWFudGljczFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfY29sb3JfbWlzdXNlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBjb252ZXkgaW5mb3JtYXRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgY29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMS40LjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAvLyBjaGVjayBpbXBvcnRcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4ID0gMDsgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGUgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVJbXBvcnRSdWxlOiBDU1NJbXBvcnRSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gMyAvKiBDU1NSdWxlLklNUE9SVF9SVUxFICovICYmIChzdHlsZUltcG9ydFJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTSW1wb3J0UnVsZSkuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0UnVsZXMgPSBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzIDogc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IGltcG9ydFJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpUnVsZSA9IGltcG9ydFJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gaVJ1bGUuY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImxpbmtcIiAmJiAvL2NoZWNrIGV4dGVybmFsIHN0eWxlc1xuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicmVsXCIpICYmXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdHlsZXNoZWV0XCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIikudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gcnVsZXNbckluZGV4XS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gRGVmZWN0IDEwMjI6IEZpbmQgdXNlcyBvZiAnY29sb3InIGFuZCAnKmJhY2tncm91bmQqJyBvbmx5XG4gICAgICAgIGxldCBpc0JnVXNlZCA9IHN0eWxlVGV4dC5tYXRjaCgvXFxiYmFja2dyb3VuZFxcYi9pKTtcblxuICAgICAgICBsZXQgdGhlQ29sb3JTdHlsZVRvQ2hlY2sgPSBzdHlsZVRleHQucmVwbGFjZSgvLWNvbG9yL2csIFwiXCIpO1xuICAgICAgICBsZXQgaXNDb2xvclVzZWQgPSB0aGVDb2xvclN0eWxlVG9DaGVjay5tYXRjaCgvXFxiY29sb3JcXGIvaSk7XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvbG9yXCIpIHx8IGlzQ29sb3JVc2VkIHx8IGlzQmdVc2VkKSB7XG4gICAgICAgICAgICBsZXQgZ29vZFRhZ05hbWVzID0ge1xuICAgICAgICAgICAgICAgIFwiZW1cIjogXCJcIiwgXCJzdHJvbmdcIjogXCJcIiwgXCJjaXRlXCI6IFwiXCIsIFwiZGZuXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IFwiXCIsIFwic2FtcFwiOiBcIlwiLCBcImtiZFwiOiBcIlwiLCBcInZhclwiOiBcIlwiLCBcImFiYnJcIjogXCJcIiwgXCJhY3JvbnltXCI6IFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvbG9yIHVzZWQg77+9IGFyZSB0aGVyZSBzZW1hbnRpY3MgaW52b2x2ZWQ/XG4gICAgICAgICAgICBwYXNzZWQgPSBub2RlTmFtZSBpbiBnb29kVGFnTmFtZXMgfHxcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBnb29kVGFnTmFtZXMpICE9PSBudWxsO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgLy9sZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgaW4gZ29vZFRhZ05hbWVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUcmlnZ2VyIG9ubHkgb25jZVxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCBmYWxzZSk7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cmlnZ2VyZWQ7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9jb2xvcl9taXN1c2VcIiwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBDb2xvclV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db2xvclV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2ZvY3VzX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfZm9jdXNfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9IaW5kZXJGb2N1czFcIjoge1xuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBzdHlsZV9mb2N1c192aXNpYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NfZm9jdXNfdmlzaWJsZVwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIHNob3VsZCBiZSB2aXNpYmxlIHdoZW4gZGVmYXVsdCBib3JkZXIgb3Igb3V0bGluZSBpcyBtb2RpZmllZCBieSBDU1NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCI6IFwiQ2hlY2sgdGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlIHdoZW4gdXNpbmcgQ1NTIGRlY2xhcmF0aW9uIGZvciAnYm9yZGVyJyBvciAnb3V0bGluZSdcIixcbiAgICAgICAgICAgIFwicGFzc19mb2N1c192aXNpYmxlXCI6IFwiVGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlIG9yIGlzIG5vdCBjaGFuZ2VkIGZyb20gdGhlIGJyb3dzZXIgZGVmYXVsdFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMi40LjdcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgc2tpcE5vZGVzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcInRhYmxlXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNoZWNrUGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcImJvcmRlclwiLCBcImJvcmRlci13aWR0aFwiLCBcImJvcmRlci1zdHlsZVwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLXRvcC13aWR0aFwiLCBcImJvcmRlci1yaWdodC13aWR0aFwiLCBcImJvcmRlci1ib3R0b20td2lkdGhcIiwgXCJib3JkZXItbGVmdC13aWR0aFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLXRvcC1jb2xvclwiLCBcImJvcmRlci1yaWdodC1jb2xvclwiLCBcImJvcmRlci1ib3R0b20tY29sb3JcIiwgXCJib3JkZXItbGVmdC1jb2xvclwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLXRvcC1zdHlsZVwiLCBcImJvcmRlci1yaWdodC1zdHlsZVwiLCBcImJvcmRlci1ib3R0b20tc3R5bGVcIiwgXCJib3JkZXItbGVmdC1zdHlsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJvdXRsaW5lXCIsIFwib3V0bGluZS13aWR0aFwiLCBcIm91dGxpbmUtY29sb3JcIiwgXCJvdXRsaW5lLXN0eWxlXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkgfHwgdmFsaWRhdGVQYXJhbXMuc2tpcE5vZGVzLnZhbHVlLmluY2x1ZGVzKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9ybWFsU3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0KTsgLy8gY29uc2lkZXIgbm90aCB1c2VyLWRlZmluZWQgYW5kIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICBsZXQgZm9jdXNTdHlsZXMgPSBbXVxuICAgICAgICBmb2N1c1N0eWxlcy5wdXNoKENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgXCI6Zm9jdXNcIikpO1xuICAgICAgICBmb2N1c1N0eWxlcy5wdXNoKENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgXCI6Zm9jdXMtdmlzaWJsZVwiKSk7XG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0LCBcIjpmb2N1cy13aXRoaW5cIikpO1xuICAgICAgICBcbiAgICAgICAgLy8gaWYgZm9jdXMgc3R5bGUgaXMgZGVmaW5lZFxuICAgICAgICBsZXQgc3R5bGVPYmogPSBmb2N1c1N0eWxlc1swXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0eWxlT2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL3Bhc3MgaWYgb3V0bGluZSBpcyBub3QgZGVmaW5lZCBhdCBhbGwsIGJyb3dzZXIgd2lsbCBvdmVycmlkZSBcbiAgICAgICAgICAgIGlmICgoKCFub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXdpZHRoXCJdICYmICFub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXN0eWxlXCJdKVxuICAgICAgICAgICAgICAgIHx8IChub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXdpZHRoXCJdID09PSAnMHB4JyB8fCBub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXN0eWxlXCJdID09PSAnbm9uZScpKVxuICAgICAgICAgICAgICAgICYmICghc3R5bGVPYmpbXCJvdXRsaW5lLXN0eWxlXCJdIHx8IHN0eWxlT2JqW1wib3V0bGluZS1zdHlsZVwiXSAhPT0gJ25vbmUnKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ZvY3VzX3Zpc2libGVcIik7ICAgICAgIFxuXG4gICAgICAgICAgICBsZXQgbm9uZVN0eWxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbnVtT3RoZXJTdHlsZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBmb2N1c1N0eWxlIGluIHN0eWxlT2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlUGFyYW1zLmNoZWNrUGFyYW1zLnZhbHVlLmluY2x1ZGVzKGZvY3VzU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBmYWlsdXJlIGNhc2U6ICBcbiAgICAgICAgICAgICAgICAgICAgICogIDEuIGZvY3VzIG91dGxpbmUgb3IgYm9yZGVyIHN0eWxlIGlzIG5vbmUgYW5kIG5vIG90aGVyIHN0eWxlIChjb2xvciBvciB3aWR0aCkgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgKiAgMi4gZm9jdXMgb3V0bGluZSBvciBib3JkZXIgc3R5bGUgaXMgc2FtZSB3aXRoIHRoZSBub3JtYWxcbiAgICAgICAgICAgICAgICAgICAgICogIDMuIHNpemUgaW4gZm9jdXMgaXMgc2FtZSBvciBzbWFsbGVyIHRoYW4gZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgKiAgNC4gY29sb3IgY29udHJhc3QgaW4gZm9jdXMgaXMgYmV0dGVyICBcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c1N0eWxlVmFsdWUgPSBzdHlsZU9ialtmb2N1c1N0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vcm1hbFN0eWxlVmFsdWUgPSBub3JtYWxTdHlsZXNbZm9jdXNTdHlsZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlLmluY2x1ZGVzKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09IFwibm9uZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25lU3R5bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25lU3R5bGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgJiYgZm9jdXNTdHlsZVZhbHVlICE9PSBcIm5vbmVcIiAmJiBmb2N1c1N0eWxlVmFsdWUgPT09IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJ3aWR0aFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb3hpbWF0aW9uIG9mIHRoZSB3aWR0aCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBmb2N1c1N0eWxlVmFsdWUgPSAnMnB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ3RoaW4nKSBmb2N1c1N0eWxlVmFsdWUgPSAnMXB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ21lZGl1bScpIGZvY3VzU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAndGhpY2snKSBmb2N1c1N0eWxlVmFsdWUgPSAnM3B4JzsgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAnaW5pdGlhbCcpIG5vcm1hbFN0eWxlVmFsdWUgPSAnMnB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAndGhpbicpIG5vcm1hbFN0eWxlVmFsdWUgPSAnMXB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAnbWVkaXVtJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICd0aGljaycpIG5vcm1hbFN0eWxlVmFsdWUgPSAnM3B4JzsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNTdHlsZVZhbHVlID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoZm9jdXNTdHlsZVZhbHVlLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdHlsZVZhbHVlID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUobm9ybWFsU3R5bGVWYWx1ZSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PSAwIHx8IGZvY3VzU3R5bGVWYWx1ZSA8PSBub3JtYWxTdHlsZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb2N1c1N0eWxlLmluY2x1ZGVzKFwiY29sb3JcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bU90aGVyU3R5bGUrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBlbGVtZW50IGJnIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21ibyA9IENvbG9yVXRpbC5Db2xvckNvbWJvKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiZyA9IGNvbG9yQ29tYm8uYmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm94aW1hdGlvbiBvZiB0aGUgd2lkdGggc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgZm9jdXNTdHlsZVZhbHVlID0gJ2JsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICYmIG5vcm1hbFN0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICdibGFjayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGJvcmRlci9vdXRsaW5lIGNvbG9yIGFzIGZnIGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNTdHlsZVZhbHVlID0gQ29sb3JVdGlsLkNvbG9yKGZvY3VzU3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdHlsZVZhbHVlID0gQ29sb3JVdGlsLkNvbG9yKG5vcm1hbFN0eWxlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gbnVsbCB8fCBub3JtYWxTdHlsZVZhbHVlID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGJvcmRlci9vdXRsaW5lIGNvbG9yIGNvbnRyYXN0IHJhdGlvc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzUmF0aW8gPSBmb2N1c1N0eWxlVmFsdWUuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsUmF0aW8gPSBub3JtYWxTdHlsZVZhbHVlLmNvbnRyYXN0UmF0aW8oYmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzUmF0aW8gPCAzLjAgfHwgZm9jdXNSYXRpbyA8PSBub3JtYWxSYXRpbylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bU90aGVyU3R5bGUrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICE9IG51bGwgJiYgZm9jdXNTdHlsZVZhbHVlID09PSBub3JtYWxTdHlsZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2FybiBpZiBhIGJvcmRlci9vdXRsaW5lIGZvY3VzIHN0eWxlIGlzICdub25lJyBhbmQgbm9lIG90aGVyIChjb2xvciBhbmQvb3Igd2lkdGgpIGlzIGRlZmluZWQgXG4gICAgICAgICAgICBpZiAobm9uZVN0eWxlICYmIG51bU90aGVyU3R5bGUgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBmb2N1cyBzdHlsZSBkZWZpbmVkIFxuICAgICAgICAgICAgLy8gd2FybiBpZiBub3JtYWwgc3R5bGUgaXMgZGVmaW5lZCBhbmQgaXMgbm90IFwibm9uZVwiXG4gICAgICAgICAgICBmb3IgKGxldCBub3JtYWxTdHlsZSBpbiBub3JtYWxTdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVQYXJhbXMuY2hlY2tQYXJhbXMudmFsdWUuaW5jbHVkZXMobm9ybWFsU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxTdHlsZVZhbHVlID0gbm9ybWFsU3R5bGVzW25vcm1hbFN0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGJvcmRlciBvciBvdXRsaW5lIHN0eWxlIGlzIFwibm9uZVwiIFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSAhPT0gJ25vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19mb2N1c192aXNpYmxlXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9UcmlnZ2VyMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIFdpbmRvd3MgaGlnaCBjb250cmFzdCBtb2RlIGlzIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBDU1MgdG8gaW5jbHVkZSwgcG9zaXRpb24gb3IgYWx0ZXIgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIxLjMuMlwiLCBcIjEuNC4xMVwiXSwgIC8vb3RoZXIgXCJzdHlsZVwiIHJ1bGVzIGZvciBmb2N1cywgaG92ZXIsIGFuZCBjb2xvclxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiMS4zLjJcIiwgXCIxLjQuMTFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmXG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHlsZXNoZWV0XCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwic3R5bGVcIiAmJiBub2RlTmFtZSAhPT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGxldCB0cmlnZ2VyZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZVwiLCBmYWxzZSk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cmlnZ2VyZWQ7XG4gICAgICAgIC8vICAgICAgICBQYWNrYWdlcy5qYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKHRyaWdnZXJlZCk7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIHRydWUpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2hvdmVyX3BlcnNpc3RlbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIlBhc3NfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGhlIGhvdmVyOiBwc2V1ZG8tY2xhc3MgaXMgbm90IHVzZWQgdG8gZGlzcGxheSBjb250ZW50XCIsXG4gICAgICAgICAgICAvLyBcIlBhc3NfMVwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyB0aGUgYWRqYWNlbnQgc2libGluZyBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgcG9pbnRlciBjYW4gYmUgcG9zaXRpb25lZCBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgYWxsIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgb24gaG92ZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJDb25maXJtIHRoZSBtYXJnaW4gc3R5bGUgYXR0cmlidXRlIGhhcyBub3QgcHJldmVudGVkIHRoZSBwb2ludGVyIGZyb20gaG92ZXJpbmcgb3ZlciB0aGUgZGlzcGxheWVkIGVsZW1lbnQsIG5vdCBqdXN0IHRoZSB0cmlnZ2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBvaW50ZXIgc2hvdWxkIGJlIGFibGUgdG8gbW92ZSBvdmVyIGNvbnRlbnQgZGlzcGxheWVkIG9uIGhvdmVyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEzXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCBwYXNzMCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczEgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhc3MyID0gZmFsc2U7IC8vIG5ldmVyIGhhcHBlblxuICAgICAgICBsZXQgcG90ZW50aWFsMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMiA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJSVUxFIFJVTiAqKioqKioqKioqKioqKioqKipcIik7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCA9IFwiK3J1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlcy5sZW5ndGggPSBcIitzdHlsZVJ1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIEZPUiBMT09QIHN0eWxlUnVsZUluZGV4ID0gXCIrc3R5bGVSdWxlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZEhvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdXNDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGRlQ29tYmluYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50SG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0VsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGphY2VudFBsdXNTaWJsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50VGlsZGVNdWx0aXBsZVNpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0ID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXNbXCIrc3R5bGVSdWxlSW5kZXgrXCJdID0gXCIrcnVsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIENoZWNrIGZvciA6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBmb3VuZCA6aG92ZXIgPSBcIisgZm91bmRIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEdldCBob3ZlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudCA9IHJ1bGVUZXh0LnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIyLiBmb3VuZCBlbGVtZW50IHRoYXQgZ29lcyB3aXRoIDpob3ZlciA9IFwiK2hvdmVyRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBObyBob3ZlciBvbiBjc3MgZWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIG5vIDpob3ZlciBza2lwIHRoaXMgcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYS4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0YS4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIitcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXCsvZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3ZlclxcKy9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2EuIEZvdW5kIHBsdXNDb21iaW5hdG9yID0gXCIrIHBsdXNDb21iaW5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0YS4gRm91bmQgcGx1cyBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gM2IuIENoZWNrIGZvciBjc3MgY29tYmluYXRvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNGIuIGlmIHNvIGRvIHdlIGhhdmUgYW4gYWZ0ZXIgY29tYmluYXRvciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXIgXFx+L2cpIHx8IHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXJcXH4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaCA9IFwiK3J1bGVUZXh0Lm1hdGNoKFwiOmhvdmVyIFxcflwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGRlQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2IuIEZvdW5kIHRpbGRlQ29tYmluYXRvciA9IFwiKyB0aWxkZUNvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIn5cIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1RlbXBTdHIgPSBwbHVzVGVtcFN0ci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBwbHVzVGVtcFN0ci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNGIuIEZvdW5kIHRpbGRlIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsdXNDb21iaW5hdG9yICYmICF0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIFBBU1NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTsgLy8gSkNIOiBzaG91bGQgd2UgaGF2ZSBhIE4vQSBwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gbm93IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGhvdmVyIC0gZWxlbWVudDpob3ZlciBzbyB3ZSBoYXZlIHByb2JsZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2hlY2tcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuIENoZWNrIGlmIHRoZSBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnQgaGFzIGRpc3BsYXk6IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNi4gQ2hlY2sgaWYgZGlzcGxheSBwcm9wZXJ0eSBpcyBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBvZiBkaXNwbGF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBsdXNUZW1wU3RyID0gXCIrcGx1c1RlbXBTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwbHVzVGVtcFN0ci5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI1LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNi4gRm91bmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IG5vbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMCBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgc28gc2tpcCB0aGlzIHJ1bGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXIgb2YgdGhlIGZvcm1hdCBzcGFuOmhvdmVyICsgZGl2IHsgZGlzcGxheTogYmxvY2s7IH0gd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgdGhhdCB3ZSBoYXZlIGEgY3NzIGVsZW1lbnQgd2l0aCBhIGhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlczIgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4MiA9IDA7IHN0eWxlUnVsZUluZGV4MiA8IHN0eWxlUnVsZXMyLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcnVsZSBmb3IgYWZ0ZXJDb21pbmF0b3JFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudDpob3ZlciBzZWUgaWYgcnVsZSBoYXMgcHJvcGVydHkgZGlzcGxheTogdmFsdWUgd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgIT0gbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKiAybmQgRk9SIHN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlVGV4dDIgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4Ml0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlVGV4dDIgPSBcIiwgcnVsZVRleHQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFsbCBzdXBwb3J0aW5nIGVsZW1lbnRzIGZvciBtYXJnaW4gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBtYXJnaW4gU1RPUCBhbmQgUkVQT1JUIEVSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdFeFN0cmluZyA9IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgKyBcIiB7XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmltUnVsZVRleHQyID0gcnVsZVRleHQyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0luZGV4ID0gdHJpbVJ1bGVUZXh0Mi5pbmRleE9mKHJlZ0V4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzID0gdHJpbVJ1bGVUZXh0Mi5zbGljZShyZWdJbmRleCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCFhZnRlckNvbWJpbmF0b3JFbGVtZW50UHJvcGVydGllcy5tYXRjaCgvbWFyZ2luL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpbVJ1bGVUZXh0Mi5tYXRjaCgvbWFyZ2luL2cpKSB7ICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJObyBtYXJnaW4gcHJvYmxlbSBzbyBjb250aW51ZSBvbi4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBzdXBwb3J0aW5nIGVsZW1lbnQgY3NzIGRlZmluaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IHJ1bGVUZXh0Mi5zcGxpdChcIjpcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gc3VwcG9ydGluZ0hvdmVyRWxlbWVudC5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBORUVEIFRPIENIRUNLIEZPUiBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXIgaW4gT05FIFNURVBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgJiYgcnVsZVRleHQyLm1hdGNoKC86aG92ZXIvZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LiBGb3VuZCBzdXBwb3J0aW5nIGhvdmVyIGVsZW1lbnQgc2FtZSBhcyBhZnRlckNvbWJpbmF0b3JFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0VsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc3VwcG9ydGluZyBlbGVtZW50IGhhdmUgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzbyA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4LiBTdXBwb3J0aW5nIGVsZW1lbnQgaGFzIGhvdmVyIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHJ1bGVUZXh0Mi5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpbmRleCA9IFwiK2luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOS4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgbm90IG5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIG5leHQgc2libGluZyBmb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yICsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiBwbHVzQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkamFjZW50IHNpYmxpbmcgPSBcIitob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID09PSBob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExYS4gSG92ZXIgd2l0aCBwbHVzIGhhcyBhZGphY2VudCBzaWJsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFBsdXNTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIGEgc3VwcG9ydGluZyBhZnRlckNvbWJpbmF0b3JFbGVtZW50IGNzcyBydWxlIHRoYXQgY29udGFpbnMgaG92ZXIgYW5kIGRpc3BsYXkgcHJvcGVydHkgdGhhdCBpcyBub3QgZXF1YWwgdG8gbm9uZSBhbmQgaGFzIGEgaG92ZXIgZWxlbWVudCBpbiB0aGUgYm9keSB3aXRoIGFuIGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIE1haW4gaG92ZXIgd2l0aCArIGNvbWJpbmF0b3IgaGFzIG5vIGFkamFjZW50IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBsaXN0IG9mIGhvdmVyIGVsZW1lbnRzIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIDIgb3IgbW9yZSBhZGphY2VudCBzaWJsaW5ncyBmb3IgflxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIH4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiB0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIraG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdHdvIG9yIG1vcmUgYWRqYWNlbnQgc2libGluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nLnRhZ05hbWUgPSBcIitzaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy50YWdOYW1lID09PSBhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ0NvdW50ID0gc2libGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2libGluZ0NvdW50ID0gXCIrc2libGluZ0NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQ0ggVE9ETzogd2hhdCBpZiBzaWJsaW5nIGNvdW50IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFiLiBIb3ZlciB3aXRoIHRpbGRlIGFuZCBvbmUgYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpYmxpbmdDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNYWluIGhvdmVyIHdpdGggfiBjb21iaW5hdG9yIGhhcyB0d28gb3IgbW9yZSBzaWJsaW5nc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyB0aWxkZSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nRWxlbWVudCBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVJbmRleDIgPSBcIitzdHlsZVJ1bGVJbmRleDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlczIubGVuZ3RoID0gXCIrc3R5bGVSdWxlczIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdFbGVtZW50ID0gXCIrc3VwcG9ydGluZ0hvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGVyZSBpcyBhIG1hcmdpbiBpbiB0aGUgc3VwcG9ydGluZyBlbGVtZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMyBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbDMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczAgPSBcIitwYXNzMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczEgPSBcIitwYXNzMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczIgPSBcIitwYXNzMik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMSA9IFwiK3BvdGVudGlhbDEpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDIgPSBcIitwb3RlbnRpYWwyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwzID0gXCIrcG90ZW50aWFsMyk7XG4gICAgICAgIGlmIChwYXNzMCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAvLyBpZiAocGFzczEpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTsgLy8gRG9lc24ndCB0cmlnZ2VyXG4gICAgICAgIC8vIGlmIChwYXNzMikgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18zXCIpOyAvLyBEb2Vzbid0IHRyaWdnZXJcbiAgICAgICAgaWYgKHBvdGVudGlhbDEpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwyKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICBpZiAocG90ZW50aWFsMykgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfM1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuLyoqXG4gKiBEZXNjcmlwdGlvbjogVHJpZ2dlciB3aGVuIHZpZXdwb3J0IHVuaXRzIGFyZSB1c2VkIGZvciBmb250IHNpemUuXG4gKiBPcmlnaW46IFZhcmlvdXNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsaW5rLCBkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX1N0eWxlX1ZpZXdwb3J0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUZXh0IG11c3Qgc2NhbGUgdXAgdG8gMjAwJSB3aXRob3V0IGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGV4dCBzaXplZCB1c2luZyB2aWV3cG9ydCB1bml0cyBjYW4gYmUgcmVzaXplZCB1cCB0byAyMDAlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS40LjRcIiwgXCIxLjQuMTBcIl0sIC8vIG1hdGNoIGhlbHAgZm9yIGJvdGggXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0aGVQYXR0ZXJuID0gL1xcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHBhc3NlZCAmJiBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLnR5cGUgJiYgcnVsZS50eXBlID09PSAxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHJ1bGUgYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0IHJ1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAocnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0UnVsZSA9IHJ1bGUgYXMgQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRlZFJ1bGUgPSBydWxlc1tySW5kZXhdIGFzIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gaW1wb3J0ZWRSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVGcm9tTGluayA9IHJ1bGVzW3JJbmRleF0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay50eXBlICYmIHJ1bGVGcm9tTGluay50eXBlID09PSAxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0eWxlVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgICBpZiAoc3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZVBhdHRlcm4gPSAvZm9udC1zaXplOlxccypcXGQrKHZ3fHZofHZtaW58dm1heCkvZ2k7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gc3R5bGVWYWx1ZS5tYXRjaChzdHlsZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3ZnX2dyYXBoaWNzX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN2Z1wiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJzdmdfZ3JhcGhpY3NfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgbm9uLWRlY29yYXRpdmUgU1ZHIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIFNWRyBlbGVtZW50IGhhcyBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcIlRoZSBTVkcgZWxlbWVudCBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIgJiYgbmFtZV9wYWlyLm5hbWUgJiYgbmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2FjY19uYW1lXCIpXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dGFibGUgZG9tOnRyW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0aFtyb2xlXSwgYXJpYTp0YWJsZSBkb206dGRbcm9sZV0sIGFyaWE6Z3JpZCBkb206dHJbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGhbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGRbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRyW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dGRbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFibGUgc3RydWN0dXJlIGVsZW1lbnRzIGNhbm5vdCBzcGVjaWZ5IGFuIGV4cGxpY2l0ICdyb2xlJyB3aXRoaW4gdGFibGUgY29udGFpbmVyc1wiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwiQW4gZXhwbGljaXQgQVJJQSAncm9sZScgaXMgbm90IHZhbGlkIGZvciA8ezB9PiBlbGVtZW50IHdpdGhpbiBhbiBBUklBIHJvbGUgJ3sxfScgcGVyIHRoZSBBUklBIGluIEhUTUwgc3BlY2lmaWNhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDsgXG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gQ29tbW9uVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAvLyBjYWNoZSB0aGUgcmVzdWx0XG4gICAgICAgIGlmIChwYXJlbnRSb2xlID09PSBudWxsIHx8IHBhcmVudFJvbGUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImV4cGxpY2l0X3JvbGVcIiwgW2NvbnRleHRbXCJkb21cIl0ubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJlbnRSb2xlWzBdLnJvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfY2FwdGlvbl9lbXB0eTogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5XCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX2VtcHR5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8dGFibGU+IGVsZW1lbnQgaGFzIGFuIGVtcHR5IDxjYXB0aW9uPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Y2FwdGlvbj4gZWxlbWVudCBmb3IgYSA8dGFibGU+IGVsZW1lbnQgbXVzdCBjb250YWluIGRlc2NyaXB0aXZlIHRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfY2FwdGlvbl9uZXN0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpjYXB0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0NhcHRpb25fSW5UYWJsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfY2FwdGlvbl9uZXN0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGNhcHRpb24+IGVsZW1lbnQgaXMgbm90IG5lc3RlZCBpbnNpZGUgYSA8dGFibGU+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhcHRpb24+IGVsZW1lbnQgbXVzdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBhc3NvY2lhdGVkIDx0YWJsZT4gZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfRGF0YUhlYWRpbmdzQXJpYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfaGVhZGVyc19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGFibGUgaGFzIG5vIGhlYWRlcnMgaWRlbnRpZmllZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkRhdGEgdGFibGUgbXVzdCBpZGVudGlmeSBoZWFkZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MVGFibGVFbGVtZW50O1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIHRoZXJlIGFyZSBubyByb3dzLCB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgbGV0IHJvd3MgPSBydWxlQ29udGV4dC5yb3dzO1xuICAgICAgICBpZiAoIVRhYmxlVXRpbC5pc0RhdGFUYWJsZShydWxlQ29udGV4dCkgfHwgcm93cyA9PT0gbnVsbCB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSBUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRkW2hlYWRlcnNdLCBkb206dGhbaGVhZGVyc11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkICdpZCcgaW4gdGhpcyBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiByZWZlcnMgdG8gaXRzZWxmXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyIHRvIGEgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW5kaWNhdGVkIHdpdGggPHRoPiBvciBhIHJvbGUgb2YgXFxcImNvbHVtbmhlYWRlclxcXCIgb3IgXFxcInJvd2hlYWRlclxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSBzaG91bGQgcmVmZXIgdG8gYSB2YWxpZCBjZWxsIGluIHRoZSBzYW1lIHRhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXCJhMjVmNDVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudFRhYmxlID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50VGFibGUpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBhcmVudFRhYmxlKSB8fCAhW1widGFibGVcIiwgXCJncmlkXCJdLmluY2x1ZGVzKHBhcmVudFJvbGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCB2YWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhlYWRlcnNcIik7XG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaWRzID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgaW52YWxpZEhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgc2FtZU5vZGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVUYWJsZUhlYWRlclZhbHVlcyA9IFtdO1xuICAgICAgICBsZXQgaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpZCA9IGlkc1tpXTtcbiAgICAgICAgICAgIGlmIChpZC50cmltKCkgPT09ICcnKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICAgICAgaWYgKCFlbGVtKVxuICAgICAgICAgICAgICAgIGludmFsaWRIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChET01VdGlsLnNhbWVOb2RlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lTm9kZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCFET01VdGlsLmlzSW5TYW1lVGFibGUoZWxlbSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHNhbWVUYWJsZUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbU5hbWUgIT09ICd0aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhlbGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyb2xlcy5pbmNsdWRlcygnY29sdW1uaGVhZGVyJykgJiYgIXJvbGVzLmluY2x1ZGVzKCdyb3doZWFkZXInKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRFbGVtSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgIGlmIChpbnZhbGlkSGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtpbnZhbGlkSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChzYW1lTm9kZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfMlwiLCBbc2FtZU5vZGVIZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcbiAgICAgICAgaWYgKHNhbWVUYWJsZUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfM1wiLCBbc2FtZVRhYmxlSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfNFwiLCBbaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMudG9TdHJpbmcoKV0pKTtcblxuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2hlYWRlcnNfcmVsYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZCwgZG9tOnRoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX1RhYmxlX0RhdGFDZWxsUmVsYXRpb25zaGlwc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29tcGxleCB0YWJsZSBkb2VzIG5vdCBoYXZlIGhlYWRlcnMgZm9yIGVhY2ggY2VsbCBwcm9wZXJseSBkZWZpbmVkIHdpdGggJ2hlYWRlcicgb3IgJ3Njb3BlJ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZvciBhIGNvbXBsZXggZGF0YSB0YWJsZSwgYWxsIDx0aD4gYW5kIDx0ZD4gZWxlbWVudHMgbXVzdCBiZSByZWxhdGVkIHZpYSAnaGVhZGVyJyBvciAnc2NvcGUnIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRUYWJsZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIik7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBsYXlvdXQgdGFibGUgb3IgYSBzaW1wbGUgdGFibGUgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGlmIChwYXJlbnRUYWJsZSA9PSBudWxsIHx8ICFUYWJsZVV0aWwuaXNDb21wbGV4RGF0YVRhYmxlKHBhcmVudFRhYmxlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIElmIHRoaXMgdGFibGUgaGFzbid0IGJlZW4gcHJlcHJvY2Vzc2VkLCBwcm9jZXNzIGl0LlxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQnVpbGQgYSBncmlkIHRoYXQncyBhY3R1YWxseSB1c2FibGUgKHJvd3NwYW4gYW5kIGNvbHNwYW4gZWxlbWVudHMgYXJlIGR1cGxpY2F0ZWQpXG4gICAgICAgICAgICAvLyBUaGlzIGJ1aWxkcyBhIHJlYWwgMmQgdGFibGUgYXJyYXkuXG4gICAgICAgICAgICBsZXQgZ3JpZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRUYWJsZS5yb3dzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdyA9IHBhcmVudFRhYmxlLnJvd3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFncmlkW2ldKSBncmlkW2ldID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbal07XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBpICsgXCI6XCIgKyBqKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aWR0aCkgd2lkdGggPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VJbnQoY2VsbC5nZXRBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWlnaHQpIGhlaWdodCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBnWCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChncmlkW2ldW2dYXSkgZ1ggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZWlnaHQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkW2kgKyBrXSkgZ3JpZFtpICsga10gPSBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCB3aWR0aDsgKytsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFtpICsga11bZ1ggKyBsXSA9IGNlbGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGFibGUgZ3JpZCBhbmQgcmVjb3JkIGhlYWRlcnMgdGhhdCBwb2ludCB0byBjZWxscyBhbmRcbiAgICAgICAgICAgIC8vIGNlbGxzIHRoYXQgYXJlIHBvaW50ZWQgdG8gYnkgaGVhZGVyc1xuICAgICAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICBsZXQgbG9va3VwID0ge31cbiAgICAgICAgICAgIGxldCBzY29wZWRDb2xzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyaWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm93U2NvcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBncmlkW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkQ2VsbCA9IGdyaWRbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmlkTm9kZU5hbWUgPSBncmlkQ2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWRDZWxsLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTY29wZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcImNvbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkQ29sc1tqXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBheGlzIGF0dHJpYnV0ZSwgaXQgbXVzdCBiZSByZWZlcnJlZCB0byBieSBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjb3BlIGlzIG5vdCBlbm91Z2guXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGdyaWRDZWxsLCBcImF4aXNcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWFkZXJzIGNhbiByZWZlciB0byBvdGhlciBoZWFkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhkcnMgPSBncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGhkcnMubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRFbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKGhkcnNba10udHJpbSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRFbGVtICYmIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoaGVhZEVsZW0sIFwidGFibGVcIikgPT0gcGFyZW50VGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoaGVhZEVsZW0sIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZE5vZGVOYW1lID09IFwidGRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1Njb3BlZCB8fCBzY29wZWRDb2xzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhkcnMgPSBncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGhkcnMubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRFbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKGhkcnNba10udHJpbSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRFbGVtICYmIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoaGVhZEVsZW0sIFwidGFibGVcIikgPT0gcGFyZW50VGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHBhcmVudFRhYmxlLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBsb29rdXApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJjSW5mbyA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCk7XG4gICAgICAgIGxldCB0SW5mbyA9IENhY2hlVXRpbC5nZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSByY0luZm8gJiYgdEluZm8gJiYgcmNJbmZvIGluIHRJbmZvO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJjSW5mbyA9PT0gXCIwOjBcIiAmJlxuICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgdGVzdCBpZiBpdCdzIHRoZSB1cHBlci1sZWZ0IGNlbGwgYW5kIGl0J3MgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHRhYmxlIGhhcyBubyB0aCdzLCBpdCBtYXkganVzdCBiZSB0aGF0IHRoaXMgd2FzIHN1cHBvc2VkIHRvIGJlIGEgbGF5b3V0XG4gICAgICAgIC8vIHRhYmxlLCB3aGljaCBpbnRyb2R1Y2VzIGEgbG90IG9mIG5vaXNlLiAgSW4gdGhhdCBjYXNlLCBvbmx5IHRyaWdnZXIgdGhpcyBlcnJvclxuICAgICAgICAvLyBvbmNlIHBlciB0YWJsZS5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcGFyZW50VGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgZmFsc2UpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHBhcmVudFRhYmxlLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZF9UcmlnT25jZVwiLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2xheW91dF9saW5lYXJpemVkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkXCIsXG4gICAgY29udGV4dDogXCJkb206dGFibGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9UYWJsZV9MYXlvdXRUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0YWJsZSBpcyBub3QgYmVpbmcgdXNlZCB0byBmb3JtYXQgdGV4dCBjb250ZW50IGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkF2b2lkIHVzaW5nIHRhYmxlcyB0byBmb3JtYXQgdGV4dCBkb2N1bWVudHMgaW4gY29sdW1ucyB1bmxlc3MgdGhlIHRhYmxlIGNhbiBiZSBsaW5lYXJpemVkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhVGFibGVVdGlsLmlzTGF5b3V0VGFibGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfc2NvcGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfc2NvcGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZFtzY29wZV0sIGRvbTp0aFtzY29wZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UYWJsZV9TY29wZV9WYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVmFsdWUgcHJvdmlkZWQgaXMgaW52YWxpZCBmb3IgdGhlICdzY29wZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnc2NvcGUnIGF0dHJpYnV0ZSBzaG91bGQgb25seSBiZSB1c2VkIG9uIGEgPHRoPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVmFsdWUgZm9yICdzY29wZScgYXR0cmlidXRlIG11c3QgYmUgXFxcInJvd1xcXCIsIFxcXCJjb2xcXFwiLCBcXFwicm93Z3JvdXBcXFwiLCBvciBcXFwiY29sZ3JvdXBcXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3RkJylcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcblxuICAgICAgICAvL29ubHkgY29udGludWUgZm9yICd0aCdcbiAgICAgICAgbGV0IHNjb3BlVmFsID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSAvXihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSQvLnRlc3Qoc2NvcGVWYWwpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX3N0cnVjdHVyZV9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfc3RydWN0dXJlX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfU3RydWN0dXJlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc3RydWN0dXJlX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCB3aXRoIFxcXCJwcmVzZW50YXRpb25cXFwiIHJvbGUgb3IgXFxcIm5vbmVcXFwiIHJvbGUgaGFzIHN0cnVjdHVyYWwgZWxlbWVudChzKSBhbmQvb3IgYXR0cmlidXRlKHMpICd7MX0nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFibGUgZWxlbWVudHMgd2l0aCAncm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIiBvciAncm9sZT1cXFwibm9uZVxcXCIgc2hvdWxkIG5vdCBoYXZlIHN0cnVjdHVyYWwgZWxlbWVudHMgb3IgYXR0cmlidXRlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKFRhYmxlVXRpbC5pc0RhdGFUYWJsZShydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOb2RlSW5HcmlkKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGVycm9yTm9kZXMgPSBbXTtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic3VtbWFyeVwiKSlcbiAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgbGV0IGNhcHRpb25FbGVtcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY2FwdGlvblwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYXB0aW9uRWxlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKGNhcHRpb25FbGVtc1tpXSwgXCJ0YWJsZVwiKSA9PSBydWxlQ29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIGFuZCBpZiB0aGUgbm9kZSBpc1Zpc2libGUgb3JcbiAgICAgICAgICAgICAgICAvLyBub3QuXG4gICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihjYXB0aW9uRWxlbXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaChjYXB0aW9uRWxlbXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRoTm9kZXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoXCIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHRoTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGhOb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRoTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0ZE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoKHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwic2NvcGVcIikgfHwgdGROb2Rlc1tpXS5oYXNBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKSAmJlxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IodGROb2Rlc1tpXSwgXCJ0YWJsZVwiKSA9PSBydWxlQ29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIGFuZCBpZiB0aGUgbm9kZSBpc1Zpc2libGUgb3JcbiAgICAgICAgICAgICAgICAvLyBub3QuXG4gICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih0ZE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2godGROb2Rlc1tpXSk7XG5cbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgbm90IGFjdHVhbGx5IG1ha2luZyB1c2Ugb2YgdGhlc2VzIGVycm9yTm9kZXMgZXZlbiB0aG91Z2ggdGhleSBhcmUgcGFzc2VkIGFsb25nIHdpdGhcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0aW9uUmVzdWx0LCB3ZSBkbyBub3QgbmVlZCB0byBrZWVwIGxvb3Bpbmcgb3ZlciBhbmQgZ2V0dGluZyBldmVyeSBzaW5nbGUgdmlvbGF0aW5nIG5vZGUgdW5kZXJcbiAgICAgICAgICAgICAgICAvLyB0aGUgcnVsZSBjb250ZXh0LiBUaGlzIGNhbiBiZSBhIGZ1dHVyZSBlbmhhbmNlbm1lbnQgd2hlcmUgd2UgYWN0dWFsbHkgbWFrZSB1c2Ugb2YgdGhlIGVycm9yIG5vZGVzIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBhcmUgcGFzc2VkIGFsb25nLiBBZGRpbmcgdGhpcyBicmVhayB0byBzcGVlZCB1cCBwZXJmb3JtYW5jZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBUaGVyZSBpcyBubyBwb2ludCB0byBrZWVwIGFkZGluZyB0aGUgZXJyb3Igbm9kZXMsIHN0b3AgYWZ0ZXIgZmluZGluZyB0aGUgZmlyc3Qgb25lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIG5vZGUgbmFtZSBmb3IgdGhlIHJ1bGUgY29udGV4dCBlbGVtZW50IGluIHRoaXMgY2FzZSBpdCB3aWxsIGFsd2F5cyBiZSB0YWJsZVxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnRUb2tlbiA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGEgbmV3IGFycmF5IHdoaWNoIHdpbGwgY29udGFuIG9ubHkgdGhlIGVsZW1lbnQgdGFnIGZvciB0aGUgdmlvbGF0aW9uIGVsZW1lbnRzXG4gICAgICAgIGxldCBzdHJ1Y3R1cmFsRWxlbWVudFRva2VucyA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIHNlZW4gaGFzaCB0aGF0IHdpbGwga2VlcCB0cmFzayBvZiBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgd2VyZSBhbHJlYWR5IGFkZGVkIHRvIHRoZSB0b2tlbiBhcnJheSwgdG8gbWFrZSBzdXJlXG4gICAgICAgIC8vIHdlIGRvIG5vdCBkdXBsaWNhdGUgYW55IG9mIHRoZSBlbGVtZW50cy4gRHVwbGljYXRlIGVsZW1lbnQgdGFncyBpbiB0aGUgdG9rZW4gbWVzc2FnZSBsb29rcyBiYWQgYW5kIGNvbmZ1c2luZy5cbiAgICAgICAgbGV0IHNlZW4gPSB7fTtcblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50cyBhbmQgZXh0cmFjdCB0aGUgZWxlbWVudCB0YWcgdG8gYmUgdXNlZCBhcyBhIHRva2VuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgKHRhZyBuYW1lKSBmb3IgdGhlIHZpb2xhdGluZyBzdHJ1Y3R1cmFsIGVsZW1lbnRcbiAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IGVycm9yTm9kZXNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgLy8gT25seSBuZWVkIHRvIGFkZCB0aGUgdmlvbGF0aW5nIGVsZW1lbnQgb25jZVxuICAgICAgICAgICAgaWYgKCFzZWVuLmhhc093blByb3BlcnR5KG5vZGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBhZGRpbmcgdGhlIHRva2VuIGFzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdlIG5lZWQgdG8gaGFuZGxlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHN1bW1hcnkgYXR0cmlidXRlIG9uIHRoZSBydWxlQ29udGV4dCAodGFibGUpLiBXZSBvbmx5IGFkZCBzdW1tYXJ5IG9uY2UsIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAvLyBmb3IgZWxlbWVudHMgdG8gYXZvaWQgZHVwbGljYXRpb24gaW4gdGhlIG1lc3NhZ2UuIChTdW1tYXJ5IHNob3VsZCBub3QgZHVwbGljYXRlLCBidXQganVzdCBpbiBjYXNlKVxuICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBcInRhYmxlXCIgJiYgIXNlZW4uaGFzT3duUHJvcGVydHlbXCJzdW1tYXJ5XCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhpcyBhcyBhIG5ldyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgc2VlbltcInN1bW1hcnlcIl0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBuZXcgdmlvbGF0aW5nIGVsZW1lbnQgYWRkIGl0IHRvIHRoZSBzdHJ1Y3R1cmFsIGVsZW1lbnQgdG9rZW5zIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zLnB1c2goXCJzdW1tYXJ5XCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhpcyBhcyBhIG5ldyBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIHNlZW5bbm9kZU5hbWVdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKG5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHRha2UgdGhlIGFycmF5IG9mIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGpvaW4gdGhlbSB3aXRoIGEgY29tbWEgYW5kIGEgc3BhY2UgdG8gbWFrZSBncmFtbWF0aWNhbCBjb3JyZWN0IGluXG4gICAgICAgIC8vIHRoZSBtZXNzYWdlLlxuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnNTdHIgPSBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5qb2luKFwiLCBcIik7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZXJyb3JOb2Rlcy5sZW5ndGggPT0gMCwgZXJyb3JOb2RlcywgJycsICcnLCBbY3VycmVudEVsZW1lbnRUb2tlbiwgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnNdKTtcbiAgICAgICAgaWYgKGVycm9yTm9kZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbY3VycmVudEVsZW1lbnRUb2tlbiwgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnNTdHJdKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX3N1bW1hcnlfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206dGFibGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UYWJsZV9DYXBTdW1tUmVkdW5kYW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdGFibGUgc3VtbWFyeSBkdXBsaWNhdGVzIHRoZSBjYXB0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHRhYmxlIHN1bW1hcnkgbXVzdCBub3QgZHVwbGljYXRlIHRoZSBjYXB0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwb2ZJZDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBzdW1TdHI7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzdW1tYXJ5XCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDA7XG4gICAgICAgICAgICBzdW1TdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdW1tYXJ5XCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikpIHtcbiAgICAgICAgICAgIHBvZklkID0gMTtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUlkcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlQ29uY2F0ID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VtbWFyeU5vZGVJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVJZCA9IHN1bW1hcnlOb2RlSWRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5Tm9kZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBzdW1tYXJ5Tm9kZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1bW1hcnlOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKHN1bW1hcnlOb2RlLHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeU5vZGVDb25jYXQgKz0gXCIgXCIgKyBDb21tb25VdGlsLmdldElubmVyVGV4dChzdW1tYXJ5Tm9kZSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdW1TdHIgPSBzdW1tYXJ5Tm9kZUNvbmNhdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1bVN0cikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY2FwRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgICAgICBpZiAoY2FwRWxlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN1bVN0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNhcFN0ciA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGNhcEVsZW1zWzBdKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXN1bVN0ci5pbmNsdWRlcyhjYXBTdHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBpbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuICAgIGltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVGYWlsLCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuICAgIGltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuICAgIGltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG4gICAgaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbiAgICBcbiAgICBleHBvcnQgY29uc3QgdGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudDogUnVsZSA9IHtcbiAgICAgICAgaWQ6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudFwiLFxuICAgICAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgICAgIGhlbHA6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc3BhY2luZ1wiOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQuaHRtbFwiLFxuICAgICAgICAgICAgICAgIFwicGFzc19zaXplZFwiOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQuaHRtbFwiLFxuICAgICAgICAgICAgICAgIFwicGFzc19pbmxpbmVcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfZGVmYXVsdFwiOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQuaHRtbFwiLFxuICAgICAgICAgICAgICAgIFwidmlvbGF0aW9uX3NwYWNpbmdcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInJlY29tbWVuZGF0aW9uX2lubGluZVwiOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQuaHRtbFwiLFxuICAgICAgICAgICAgICAgIFwicG90ZW50aWFsX292ZXJsYXBcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlczoge1xuICAgICAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0YXJnZXQgbXVzdCBiZSBzdWZmaWNpZW50bHkgc2l6ZWQgb3Igc3BhY2VkIGZyb20gb3RoZXIgdGFyZ2V0c1wiLFxuICAgICAgICAgICAgICAgIFwicGFzc19zcGFjaW5nXCI6IFwiVGhlIHRhcmdldCdzIHNwYWNpbmcgZnJvbSBvdGhlciB0YXJnZXRzIGlzIHN1ZmZpY2llbnRcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc2l6ZWRcIjogXCJUaGUgdGFyZ2V04oCZcyBzaXplIGlzIG1vcmUgdGhhbiAyNCBDU1MgcGl4ZWxzXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX2lubGluZVwiOiBcIlRoZSB0YXJnZXQgaXMgaW4gYSBzZW50ZW5jZSBvciBpdHMgc2l6ZSBpcyBvdGhlcndpc2UgY29uc3RyYWluZWQgYnkgdGhlIGxpbmUtaGVpZ2h0IG9mIG5vbi10YXJnZXQgdGV4dFwiLFxuICAgICAgICAgICAgICAgIFwicGFzc19kZWZhdWx0XCI6IFwiVGhlIHRhcmdldCdzIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdXNlciBhZ2VudCBhbmQgaXMgbm90IG1vZGlmaWVkIGJ5IHRoZSBhdXRob3JcIixcbiAgICAgICAgICAgICAgICBcInZpb2xhdGlvbl9zcGFjaW5nXCI6IFwiVW5kZXJzaXplZCB0YXJnZXQgXFxcInswfVxcXCIgZG9lcyBub3QgaGF2ZSBzdWZmaWNpZW50IHNwYWNpbmcgb2YgMTIgQ1NTIHBpeGVscyBmcm9tIGFub3RoZXIgdGFyZ2V0IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIjogXCJDb25maXJtIHRoZSBpbmxpbmUgdGFyZ2V0IFxcXCJ7MH1cXFwiIGlzIHN1ZmZpY2llbnRseSBzcGFjZWQgZnJvbSBhbm90aGVyIGlubGluZSB0YXJnZXQgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgICAgICBcInBvdGVudGlhbF9vdmVybGFwXCI6IFwiRW5zdXJlIHRoZSBvdmVybGFwcGVkIHRhcmdldCBcXFwiezB9XFxcIiBtZWV0cyBhIG1pbmltdW0gdGFyZ2V0IHNpemUgb3IgaGFzIHN1ZmZpY2llbnQgc3BhY2luZyBmcm9tIHRoZSBvdmVybGFwcGluZyB0YXJnZXQgXFxcInsxfVxcXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgICAgICBudW06IFtcIjIuNS44XCJdLFxuICAgICAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSxcbiAgICAgICAgICAgIHJlYXNvbkNvZGVzOiBbXCJwYXNzX3NwYWNpbmdcIixcInBhc3Nfc2l6ZWRcIiwgXCJwYXNzX2lubGluZVwiLFwicGFzc19kZWZhdWx0XCIsIFwidmlvbGF0aW9uX3NwYWNpbmdcIiwgXCJwb3RlbnRpYWxfb3ZlcmxhcFwiXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgbnVtOiBbXCIyLjUuOFwiXSxcbiAgICAgICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSxcbiAgICAgICAgICAgIHJlYXNvbkNvZGVzOiBbXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIl1cbiAgICAgICAgfV0sXG4gICAgICAgIGFjdDogW10sXG4gICAgICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTsgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG1hcHBlciA6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTsgLy9jb250ZXh0W1wiZG9tXCJdLmJvdW5kczsgICAgXG4gICAgICAgICAgICBpZiAoIWJvdW5kcykgXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBoaWRkZW4sIG5vbi10YXJnZXRcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1RhcmdldChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGlmIChib3VuZHMuaGVpZ2h0ID49IDI0ICYmIGJvdW5kcy53aWR0aCA+PSAyNClcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3NpemVkXCIpOyBcblxuICAgICAgICAgICAgLy8gY2hlY2sgaW5saW5lIGVsZW1lbnQ6IHdpdGhvdXQgdGV4dCBpbiB0aGUgc2FtZSBsaW5lXG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBDU1NVdGlsLmdldElubGluZVN0YXR1cyhydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChzdGF0dXMuaW5saW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmlvbGF0aW9uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19pbmxpbmVcIik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMTogaW5saW5lIGVsZW1lbnQgaXMgdG9vIGNsb3NlIGhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIiwgW25vZGVOYW1lLCBzdGF0dXMudmlvbGF0aW9uXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cy52aW9sYXRpb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2RlZmF1bHRcIik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMTogaW5saW5lIGVsZW1lbnQgaXMgdG9vIGNsb3NlIGhvcml6b250YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIiwgW25vZGVOYW1lLCBzdGF0dXMudmlvbGF0aW9uXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYnJvd3NlciBkZWZhdWx0XG4gICAgICAgICAgICAgICAgaWYgKENTU1V0aWwuaXNUYXJnZXRCcm93c2VyRGVmYXVsdChydWxlQ29udGV4dCkpIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2RlZmF1bHRcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGNTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGNTdHlsZSA9PT0gbnVsbCkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB6aW5kZXggPSBjU3R5bGUuekluZGV4OyAgIFxuICAgICAgICAgICAgaWYgKCF6aW5kZXggfHwgaXNOYU4oTnVtYmVyKHppbmRleCkpKVxuICAgICAgICAgICAgICAgIHppbmRleCA9IFwiMFwiO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvL3NlbGVjdCBhbGwgZWxlbWVudHMgZXhjZXB0IGl0c2VsZiBhbmQgZGVzY2VuZGFudHNcbiAgICAgICAgICAgIHZhciBlbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ICo6bm90KHNjcmlwdCk6bm90KHN0eWxlKScpO1xuICAgICAgICAgICAgaWYgKCFlbGVtcyB8fCBlbGVtcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBtaW5YID0gMjQ7XG4gICAgICAgICAgICBsZXQgbWluWSA9IDI0O1xuICAgICAgICAgICAgbGV0IGFkamFjZW50WCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgYWRqYWNlbnRZID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gW107IC8vY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgc28gdGhlaXIgZGVzY2VuZGFudHMgZG9uJ3QgbmVlZCB0byBiZSBjaGVja2VkIGFnYWluXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlbGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiAgdGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBpcyBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgICAgICAgICAgICAqICBpZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGUgcmVuZGVyZWQgZWFybGllciB3aWxsIGJlIG92ZXJsYWlkIGJ5IHRoZSBub2RlIHJlbmRlcmVkIGxhdGVyXG4gICAgICAgICAgICAgICAgICogIGZpbHRlciBvdXQgdGhlIGVsZW1lbnRzIHRoYXTigJlyZSBkZXNjZW5kYW50IG9yIGFuY2VzdG9ycyBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQsIG5vciBkZXNjZW5kYW50IG9mIHRoZSB0YXJnZXQgZWxlbWVudCdzIHNpYmxpbmdzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmNvbnRhaW5zKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpLiBcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYXNjZW5kYW50cyBvZiB0aGUgZWxlbWVudCwgbm90IGEgdGFyZ2V0LCBvciBpdHNlbGYgb3IgaXRzIGFzY2VuZGFudCBhbHJlYWR5IGNoZWNrZWQgICBcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5jb250YWlucyhydWxlQ29udGV4dCkgIHx8ICFDb21tb25VdGlsLmlzVGFyZ2V0KGVsZW0pIFxuICAgICAgICAgICAgICAgICAgIHx8IGNoZWNrZWQuc29tZShpdGVtID0+IGl0ZW0uY29udGFpbnMoZWxlbSkpKSBcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBibmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFibmRzKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB2YXIgelN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTsgXG4gICAgICAgICAgICAgICAgbGV0IHpfaW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgaWYgKHpTdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICB6X2luZGV4ID0gelN0eWxlLnpJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF6X2luZGV4IHx8IGlzTmFOKE51bWJlcih6X2luZGV4KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB6X2luZGV4ID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAyOiB0aGUgZWxlbWVudCBvdmVybGFwcyB0aGUgdGFyZ2V0IGVudGlyZWx5XG4gICAgICAgICAgICAgICAgLy8gbm90ZSB3aGVuIGEgbGluayBpcyBpbmxpbmUgd2l0aCBvdGhlciB0YXJnZXQsIGlmIHRoZSBsaW5rIHRleHQgd3JhcHMgaW4gYW5vdGhlciBsaW5lIGluIGEgZ2l2ZW4gdmlld3BvcnQsICBcbiAgICAgICAgICAgICAgICAvLyB0aGUgYm91bmRzIG9mIHRoZSBsaW5rIG1heSBjb3ZlciBhbmQgdGhlIGVudGlyZSB0d28gbGluZXMsIGNhdXNpbmcgdGhlIG90aGVyIHRhZ2V0cyB0byBiZSBvdmVybGFwcGVkLCBzZWUgdHdvIGxpbmtzIGluIHRoZSB0ZXN0IGNhc2U6IGVsZW1lbnRfaW5saW5lLmh0bWwgXG4gICAgICAgICAgICAgICAgaWYgKGJuZHMudG9wIDw9IGJvdW5kcy50b3AgJiYgYm5kcy5sZWZ0IDw9IGJvdW5kcy5sZWZ0ICYmIGJuZHMudG9wICsgYm5kcy5oZWlnaHQgPj0gYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgXG4gICAgICAgICAgICAgICAgICAgICYmIGJuZHMubGVmdCArIGJuZHMud2lkdGggPj0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBvbiB0b3AgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmUgPyBwYXJzZUludCh6aW5kZXgpIDwgcGFyc2VJbnQoel9pbmRleCk6IHBhcnNlSW50KHppbmRleCkgPD0gcGFyc2VJbnQoel9pbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgaXMgZW50aXJlbHkgY292ZXJlZDogdGFiYmFibGUgdGFyZ2V0IGhhbmRsZWQgYnkgZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkIGFuZCB0YWJpbmRleD0tMSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdmVybGFwXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IGlmIHRoZSB0YXJnZXQgb3ZlcmxhcHMgdGhlIGVsZW1lbnQgZW50aXJlbHlcbiAgICAgICAgICAgICAgICBpZiAoYm91bmRzLnRvcCA8PSBibmRzLnRvcCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gYm5kcy50b3AgKyBibmRzLmhlaWdodCBcbiAgICAgICAgICAgICAgICAgICAgJiYgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPj0gYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBvbiB0b3AgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmUgPyBwYXJzZUludCh6aW5kZXgpIDwgcGFyc2VJbnQoel9pbmRleCk6IHBhcnNlSW50KHppbmRleCkgPD0gcGFyc2VJbnQoel9pbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX292ZXJsYXBcIiwgW25vZGVOYW1lLCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTsgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSAvLyB0aGUgdGFyZ2V0IG9uIHRvcFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwidmlvbGF0aW9uX3NwYWNpbmdcIiwgW25vZGVOYW1lLCBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTsgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBjYXNlIDQ6IHRoZSBlbGVtZW50IG92ZXJsYXBzIHBhcnRpYWxseSB3aXRoIHRoZSB0YXJnZXRcbiAgICAgICAgICAgICAgICBpZiAoKCgoYm91bmRzLnRvcCA+PSBibmRzLnRvcCAmJiBib3VuZHMudG9wIDw9IGJuZHMudG9wICsgYm5kcy5oZWlnaHQpIHx8IChib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCA8PSBibmRzLnRvcCAmJiBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCA+PSBibmRzLnRvcCArYm5kcy5oZWlnaHQpKVxuICAgICAgICAgICAgICAgICAgICAgJiYgKChib3VuZHMubGVmdCA+IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHx8IChibmRzLmxlZnQgPiBib3VuZHMubGVmdCAmJiBibmRzLmxlZnQgPCBib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCkpKSBcbiAgICAgICAgICAgICAgICAgICAgIHx8ICgoKGJvdW5kcy50b3AgPiBibmRzLnRvcCAmJiBib3VuZHMudG9wIDwgYm5kcy50b3AgKyBibmRzLmhlaWdodCkgfHwgKGJuZHMudG9wID4gYm91bmRzLnRvcCAmJiBibmRzLnRvcCA8IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICYmICgoYm91bmRzLmxlZnQgPj0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0IDw9IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHx8IChib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCA+PSBibmRzLmxlZnQgJiYgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPD0gYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBjaGVjayB0byB0dXJuIHRvIHZpb2xhdGlvbiAgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdmVybGFwXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7IFxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbm8gb3ZlcmxhcCB3aXRoIHRoZSBlbGVtLCB0aG91Z2ggbWF5IG92ZXJsYXAgd2l0aGUgb3RoZXIgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpc1ggPSAyNDsgXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXNZID0gMjQ7ICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIHRoZSBob3Jpem9udGFsbHkgc2FtZSByb3cgd2l0aCB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIGlmIChib3VuZHMud2lkdGggPCAyNCAmJiAoKGJvdW5kcy50b3AgPj0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8PSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSB8fCAoYm91bmRzLnRvcCA8PSBibmRzLnRvcCAmJiBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCA+IGJuZHMudG9wKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNYID0gTWF0aC5taW4oIE1hdGguYWJzKGJvdW5kcy5sZWZ0IC0gYm5kcy5sZWZ0KSwgTWF0aC5hYnMoYm91bmRzLmxlZnQgLSAoYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkpLCAgTWF0aC5hYnMoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSAoYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkpLCBNYXRoLmFicyhib3VuZHMubGVmdCArIGJvdW5kcy53aWR0aCAtIGJuZHMubGVmdCkpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgaXMgaW4gdGhlIHZlcnRpY2FsbHkgc2FtZSBjb2x1bW4gd2l0aCB0aGUgdGFyZ2V0ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLmhlaWdodCA8IDI0ICYmICgoYm91bmRzLmxlZnQgPj0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0IDw9IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHx8IChib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgJiYgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPiBibmRzLmxlZnQpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc1kgPSBNYXRoLm1pbihNYXRoLmFicyhib3VuZHMudG9wIC0gYm5kcy50b3ApLCBNYXRoLmFicyhib3VuZHMudG9wIC0gKGJuZHMudG9wICsgYm5kcy5oZWlnaHQpKSwgIE1hdGguYWJzKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gKGJuZHMudG9wICsgYm5kcy5oZWlnaHQpKSwgTWF0aC5hYnMoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgLSBibmRzLnRvcCkpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc1ggPCBtaW5YKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5YID0gZGlzWDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkamFjZW50WCA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNZIDwgbWluWSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluWSA9IGRpc1k7ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFkgPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQucHVzaChlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gY2FzZSA1OiBubyBvdmVybGFwICsgaW5zdWZmaWNpZW50IHRhcmdldCBzaXplLiBjaGVjayBzcGFjaW5nICAgIFxuICAgICAgICAgICAgaWYgKE1hdGgucm91bmQoYm91bmRzLndpZHRoLzIpICsgbWluWCA8IDEyIHx8IE1hdGgucm91bmQoYm91bmRzLmhlaWdodC8yKSArIG1pblkgPCAxMikge1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aC8yKSArIG1pblggPCBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQvMikgKyBtaW5ZKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJ2aW9sYXRpb25fc3BhY2luZ1wiLCBbbm9kZU5hbWUsIGFkamFjZW50WC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7IFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFtub2RlTmFtZSwgYWRqYWNlbnRZLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgICAgIH0gZWxzZSBcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3NwYWNpbmdcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfYmxvY2tfaGVhZGluZzogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTpwLCBkb206ZGl2LCBkb206YnJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9CbG9ja19TaG91bGRCZUhlYWRpbmdcIjoge1xuICAgICAgICAgICAgLy8gXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2hlYWRpbmdcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfaGVhZGluZ1wiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIkhlYWRpbmcgdGV4dCB1c2VzIGEgaGVhZGluZyBlbGVtZW50IG9yIHJvbGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2hlYWRpbmdcIjogXCJDb25maXJtIHRoaXMgdGV4dCAnezB9JyBpcyB1c2VkIGFzIGEgaGVhZGluZyBhbmQgaWYgc28sIG1vZGlmeSB0byB1c2UgYSBoZWFkaW5nIGVsZW1lbnQgb3Igcm9sZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhlYWRpbmcgdGV4dCBzaG91bGQgdXNlIGEgaGVhZGluZyBlbGVtZW50IG9yIHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiXSkgPT09IG51bGwgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCJdKSAhPT0gbnVsbCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG51bVdvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDEwLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBib2R5Rm9udCA9IDA7XG4gICAgICAgIGxldCBib2R5ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIik7XG4gICAgICAgIGlmIChib2R5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBib2R5U3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGJvZHlbMF0pO1xuICAgICAgICAgICAgaWYgKGJvZHlTdHlsZSkgYm9keUZvbnQgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShib2R5U3R5bGVbJ2ZvbnQtc2l6ZSddLCBib2R5KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbnVtV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5udW1Xb3Jkcy52YWx1ZTtcbiAgICAgICAgbGV0IHdvcmRzU2VlbiA9IDA7XG4gICAgICAgIGxldCB3b3JkU3RyOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgZW1waGFzaXplZFRleHQgPSBmYWxzZTtcbiAgICAgICAgLy9sZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO253Lm5leHROb2RlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiYgXG4gICAgICAgICAgICBudy5ub2RlICE9PSBydWxlQ29udGV4dCAmJlxuICAgICAgICAgICAgbncubm9kZSAhPT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpICYmXG4gICAgICAgICAgICAhW1wiYnJcIiwgXCJkaXZcIiwgXCJwXCJdLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIC8vIERvbid0IHJlcG9ydCB0d2ljZVxuICAgICAgICB7ICAgXG4gICAgICAgICAgICBpZiAobncubm9kZSA9PT0gcnVsZUNvbnRleHQgfHwgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgbndOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDMpIHsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRleHQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgbncubm9kZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGl0J3Mgc3R5bGUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGNvbnRhaW5zIHRleHQsIGUuZy4sIDxwPiBmYWtlIGhlYWRpbmc8L3A+IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG53Lm5vZGUucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGVbJ2ZvbnQtd2VpZ2h0J10gPT09ICdib2xkJyB8fCBzdHlsZVsnZm9udC13ZWlnaHQnXSA+PSA3MDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAoc3R5bGVbJ2ZvbnQtc2l6ZSddICYmIHN0eWxlWydmb250LXNpemUnXS5pbmNsdWRlcyhcImxhcmdlXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdHlsZVsnZm9udC1zaXplJ10gJiYgYm9keUZvbnQgIT09IDAgJiYgQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVbJ2ZvbnQtc2l6ZSddLG53Lm5vZGUucGFyZW50RWxlbWVudCkgID4gYm9keUZvbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTdHIucHVzaChuZXh0U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNTZWVuICs9IHdjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgbm9kZSBiZWNhdXNlIGl0J3MgZW1waGFzaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm9kZSBjb250YWluIHJlZ3VsYXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKG53TmFtZSA9PT0gXCJiXCIgfHwgbndOYW1lID09PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PT0gXCJ1XCIgfHwgbndOYW1lID09PSBcImZvbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgY29udGFpbnMgZW1waGFzaXMgY2hpbGQsIGUuZy4sIDxwPjxzdHJvbmc+ZmFrZSBoZWFkaW5nPC9zdHJvbmc+PC9wPiBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkU3RyLnB1c2gobmV4dFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1NlZW4gKz0gd2M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBub2RlIGJlY2F1c2UgaXQncyBlbXBoYXNpemVkXG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCB3aGljaCBoYXMgYSByb2xlIGV4Y2VwdCAnZ2VuZXJpYycsICdwYXJhZ3JhcGgnIG9yICdzdHJvbmcnXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcHBsZXQgZWxlbWVudCB0aGF0IGlzIGRlcHJlY2F0ZWQgYW55d2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocm9sZSAhPT0gbnVsbCAmJiByb2xlICE9PSAnZ2VuZXJpYycgJiYgcm9sZSAhPT0gJ3BhcmFncmFwaCcgJiYgcm9sZSAhPT0gJ3N0cm9uZycpIHx8IG53TmFtZSA9PT0gXCJhcHBsZXRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmRzU2VlbiA9PSAwKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCDigJw64oCdICDigJws4oCdICDigJwt4oCdICDigJw74oCdIG9yIOKAnC7igJ0gXG4gICAgICAgIGlmICghcGFzc2VkKSBwYXNzZWQgPSAvWzosO1xcLVxcLl0kLy50ZXN0KHdvcmRTdHIuam9pbihcIiBcIikudHJpbSgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaGVhZGluZ1wiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfY29udHJhc3Rfc3VmZmljaWVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9jb250cmFzdFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFfUFZcIjoge1xuICAgICAgICAgICAgXCJwYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9jb250cmFzdFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfc2FtZV9jb2xvclwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZ3JhcGhpY19iYWNrZ3JvdW5kXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb250cmFzdCByYXRpbyBvZiB0ZXh0IHdpdGggaXRzIGJhY2tncm91bmQgbXVzdCBtZWV0IFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgY29udHJhc3QgcmF0aW8gb2YgdGV4dCB3aXRoIGl0cyBiYWNrZ3JvdW5kIG1lZXRzIFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJhc3RcIjogXCJUZXh0IGNvbnRyYXN0IG9mIHswfSB3aXRoIGl0cyBiYWNrZ3JvdW5kIGlzIGxlc3MgdGhhbiB0aGUgV0NBRyBBQSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgdGV4dCBvZiBzaXplIHsxfXB4IGFuZCB3ZWlnaHQgb2YgezJ9XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IFwiVGhlIGZvcmVncm91bmQgdGV4dCBhbmQgaXRzIGJhY2tncm91bmQgY29sb3IgYXJlIGJvdGggZGV0ZWN0ZWQgYXMgezN9LiBWZXJpZnkgdGhlIHRleHQgbWVldHMgdGhlIFdDQUcgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdGV4dF9zaGFkb3dcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IHdpdGggc2hhZG93IG1lZXRzIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4zXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbJ2FmdzRmNyddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vVE9ETyA/IHNob3VsZCBvbmx5IGNvbnNpZGVyIG5hdGl2ZSBkaXNhYmxlZCwgaWdub3JlIGFyaWEtZGlzYWJsZWRcbiAgICAgICAgLy9za2lwIGRpc2FibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgaWYgKCF3aW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyBlbGVtZW50IGhhcyBjaGlsZHJlbiB3aXRoIGFjdHVhbCB0ZXh0LlxuICAgICAgICBsZXQgY2hpbGRTdHIgPSBDb21tb25VdGlsLmdldE5vZGVUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1NoYWRvd0hvc3RFbGVtZW50KHJ1bGVDb250ZXh0KSB8fCAoQ29tbW9uVXRpbC5pc1NoYWRvd0hvc3RFbGVtZW50KHJ1bGVDb250ZXh0KSAmJiBDb21tb25VdGlsLmdldE5vZGVUZXh0KHJ1bGVDb250ZXh0LnNoYWRvd1Jvb3QpID09PSAnJykpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZFN0ci50cmltKCkubGVuZ3RoID09IDAgKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIHRleHQgZG9lcyBub3QgY29udmV5IGFueXRoaW5nIGluIGh1bWFuIGxhbmd1YWdlXG4gICAgICAgICAgICAvKiogXG4gICAgICAgICAgICAgKiAoMSkgaWdub3JlIG5vbi1hbHBoYW51bWVyaWMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIGluIEFTQ0k6IF4oYS16QS1aXFxkXFxzKVxuICAgICAgICAgICAgICogKDIpIGlnbm9yZSBub24tcHJpbnRhYmxlIHVuaWNvZGUgY2hhcmFjdGVyczogXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZcbiAgICAgICAgICAgICAqICBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzc3MDExNy93aGF0LWlzLXRoZS1yYW5nZS1vZi11bmljb2RlLXByaW50YWJsZS1jaGFyYWN0ZXJzXG4gICAgICAgICAgICAgKiAoMykgZm9yIG5vdyBub3QgY29uc2lkZXIgdW5pY29kZSBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCBhcmUgZGlmZmVyZW50IGluIGRpZmZlcmVudCBsYW5ndWFnZXNcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICAvL2xldCByZWdleCA9IC9bXihhLXpBLVpcXGRcXHMpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgbGV0IHJlZ2V4ID0gL1teKGEtekEtWlxcZFxccylcXF4oXFx1NGUwMC1cXHU5ZmZmXFx1MzQwMC1cXHU0ZGJmKVxcdTAwMDAtXFx1MDAwOFxcdTAwMEItXFx1MDAxRlxcdTAwN0YtXFx1MDA5RlxcdTIwMDAtXFx1MjAwRlxcdTIwMjgtXFx1MjAyRlxcdTIwNUYtXFx1MjA2RlxcdTMwMDBcXHVGRUZGXSsvZztcbiAgICAgICAgICAgIGNoaWxkU3RyID0gY2hpbGRTdHIudHJpbSgpLnJlcGxhY2UocmVnZXgsICcnKTtcbiAgICAgICAgICAgIGlmIChjaGlsZFN0ci50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVsZW0gPSBydWxlQ29udGV4dDtcbiAgICAgICAgLy8gdGhlIGNoaWxkIGVsZW1lbnRzIChyYXRoZXIgdGhhbiBzaGFkb3cgcm9vdCkgb2YgYSBzaGFkb3cgaG9zdCBpcyBlaXRoZXIgcmUtYXNzaWduZWQgdG8gdGhlIHNoYWRvdyBzbG90IGlmIHRoZSBzbG90IGV4aXN0cyBcbiAgICAgICAgLy8gb3Igbm90IGRpc3BsYXllZCwgc28gc2hvdWxkbid0IGJlIGNoZWNrZWQgZnJvbSB0aGUgbGlnaHQgRE9NLCByYXRoZXIgaXQgc2hvdWxkIGJlIGNoZWNrZWQgYXMgcmVhc3NnaW5nZWQgc2xvdCBlbGVtZW50KHMpIGluIHRoZSBzaGFkb3cgRE9NLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1NoYWRvd0hvc3RFbGVtZW50KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgLy8gaWYgaXQncyBkaXJlY3QgdGV4dCBvZiBhIHNoYWRvdyBob3N0XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGU9cnVsZUNvbnRleHQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZT1ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlPT0zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIG11bHRpcGxlIHRleHRzIGV4aXN0LCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9IChub2RlIGFzIFRleHQpLmFzc2lnbmVkU2xvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9ICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW0gPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIFxuICAgICAgICAvLyBKQ0ggY2xpcCBJTkZPOlxuICAgICAgICAvLyAgICAgIFRoZSBjbGlwIHByb3BlcnR5IGxldHMgeW91IHNwZWNpZnkgYSByZWN0YW5nbGUgdG8gY2xpcCBhbiBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgZWxlbWVudC4gXG4gICAgICAgIC8vICAgICAgVGhlIHJlY3RhbmdsZSBzcGVjaWZpZWQgYXMgZm91ciBjb29yZGluYXRlcywgYWxsIGZyb20gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudCB0byBiZSBjbGlwcGVkLlxuICAgICAgICAvLyAgICAgIFByb3BlcnR5IHZhbHVlczpcbiAgICAgICAgLy8gICAgICAgICAgbm9uZSAgICAgICAgVGhpcyBpcyBkZWZhdWx0LiBObyBjbGlwcGluZyBpcyBkb25lXG4gICAgICAgIC8vICAgICAgICAgIGF1dG8gICAgICAgIE5vIGNsaXBwaW5nIHdpbGwgYmUgZG9uZVxuICAgICAgICAvLyAgICAgICAgICBzaGFwZSAgICAgICBUaGUgb25seSB2YWxpZCB2YWx1ZSBpczogcmVjdCAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0KVxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBlLmcuLCBjbGlwOiByZWN0KDEwcHgsIDIwcHgsIDMwcHgsIDQwcHgpO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB0aGUgZm91ciB2YWx1ZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIG1hcmdpbi9wYWRkaW5nXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWN0IHZhbHVlcyBhcmUgcG9zaXRpdmUgcGl4ZWwgdmFsdWVzLCBlLmcuLCAxMHB4LCBldGMuXG4gICAgICAgIC8vICAgICAgICAgIG1hcmdpbi1ib3ggIFVzZXMgdGhlIG1hcmdpbiBib3ggYXMgdGhlIHJlZmVyZW5jZSBib3hcbiAgICAgICAgLy8gICAgICAgICAgYm9yZGVyLWJveCAgVXNlcyB0aGUgYm9yZGVyIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBwYWRkaW5nLWJveCBVc2VzIHRoZSBwYWRkaW5nIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBjb250ZW50LWJveFxuICAgICAgICAvLyAgICAgICAgICBmaWxsLWJveFxuICAgICAgICAvLyAgICAgICAgICBzdHJva2UtYm94XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIENTUyBjbGlwIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWRcbiAgICAgICAgLy8gICAgICBBbHNvOiBjbGlwIG9ubHkgd29ya3MgaWYgdGhlIGVsZW1lbnQgaXMgYWJzb2x1dGVseSBwb3NpdGlvbmVkIGFuZCBjYW4gb25seSBkbyByZWN0YW5nbGVzXG4gICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgdmlzaWJsZVxuICAgICAgICBsZXQgdmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGlmIChzdHlsZS53aWR0aCAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLm9wYWNpdHkgIT09IFwiMFwiICYmXG4gICAgICAgICAgICBzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiZcbiAgICAgICAgICAgIHN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmXG4gICAgICAgICAgICBzdHlsZS5vdmVyZmxvdyAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIC8vIGxlZnQgYW5kIHJpZ2h0IHdvcmsgd2l0aCBhbGwgYWJzb2x1dGUgdW5pdHNcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUubGVmdC5yZXBsYWNlKC9bXjAtOS4rLV0vLCAnJykpID4gMCkpICYmXG4gICAgICAgICAgICAoc3R5bGUubGVmdCA9PT0gXCJhdXRvXCIgfHwgKHN0eWxlLnBvc2l0aW9uID09PSAnYWJzb2x1dGUnICYmIHBhcnNlSW50KHN0eWxlLnRvcC5yZXBsYWNlKC9bXjAtOS4rLV0vLCAnJykpID4gMCkpKSB7XG4gICAgICAgICAgICB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBJUyB2aXNpYmxlXCIpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDSEVDSyBDT0xPUiBDT05UUkFTVCB1bmxlc3MgdG8gc21hbGxcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsZW1lbnQgTk9UIHZpc2libGVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRPIE5PVCBDSEVDSyBDT0xPUiBDT05UUkFTVFwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgY2xpcEhlaWdodCA9IC0xO1xuICAgICAgICBpZiAoc3R5bGUuY2xpcCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgICAgIGxldCBjbGlwU3RyaW5nID0gc3R5bGUuY2xpcC50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKGNsaXBTdHJpbmcuaW5jbHVkZXMoXCJyZWN0XCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAgICAgICAgIHZhciBsaXN0T2ZUZXh0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gcmVCcmFja2V0cy5leGVjKGNsaXBTdHJpbmcpO1xuICAgICAgICAgICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcsICcpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm91bmRBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJmb3VuZEFycltcIixpLFwiXSA9IFwiLGZvdW5kQXJyW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJsaXN0T2ZUZXh0ID0gXCIsbGlzdE9mVGV4dCk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gcGFyc2VJbnQobGlzdE9mVGV4dFswXS5yZXBsYWNlKC9weC9nLCAnJykpIC0gcGFyc2VJbnQobGlzdE9mVGV4dFsyXS5yZXBsYWNlKC9weC9nLCAnJykpO1xuICAgICAgICAgICAgY2xpcEhlaWdodCA9IE1hdGguYWJzKGNsaXBIZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSkNIIGNsaXAtcGF0aCBJTkZPOlxuICAgICAgICAvLyAgICAgIEV4Y2VsbGVudCBhcnRpY2xlIG9uIGNsaXAtcGF0aDogaHR0cHM6Ly9pc2hhZGVlZC5jb20vYXJ0aWNsZS9jbGlwLXBhdGgvXG4gICAgICAgIC8vICAgICAgY2xpcC1wYXRoIGlzIGEgdG90YWxseSBkaWZmZXJlbnQgYW5pbWFsIHdpdGggbWFueSwgbWFueSBkaWZmZXJlbnQgdmFyaWF0aW9uc1xuICAgICAgICAvLyAgICAgIFRoZSBnb2FsIHdhcyBmb3IgaXQgdG8gbm90IGJlIGFzIGxpbWl0ZWQgYXMgY2xpcFxuICAgICAgICAvLyAgICAgIFRoZSBzeW50YXggaXMgbW9yZSBjb21wbGljYXRlZCAoYXMgaXQgZG9lcyBtb3JlKSBhbmQgaXQgaXMgZGlmZmVyZW50IGZyb20gY2xpcCxcbiAgICAgICAgLy8gICAgICBlLmcuLCB0aGUgYWJvdmUgY2xpcCByZWN0YW5nbGUgd291bGQgYmUgY2xpcC1wYXRoOiBpbnNldCgxMHB4IDIwcHggMzBweCA0MHB4KTtcbiAgICAgICAgLy8gICAgICBOb3RlOiB0aGVyZSBhcmUgbm8gY29tbWFzXG4gICAgICAgIC8vICAgICAgQWxzbywgaXQgY2FuIHRha2Ugc2luZ2xlIHZhbHVlcyB0byBtYWtlIGFsbCBzaWRlcyB0aGUgc2FtZSwgb3IgMiB2YWx1ZXMgKHZlcnQvaG9yaSkuXG4gICAgICAgIC8vICAgICAgb3IgMyB2YWx1ZXMgKHRvcC9ob3JpL2JvdHRvbSlcbiAgICAgICAgLy8gICAgICBBbmQgcGVyY2VudGFnZXMgY2FuIHdvcmtzIGFzIHdlbGwgYXMgcHhcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBBbHRob3VnaCB0aGVyZSBhcmUgZml2ZSBkaWZmZXJlbnQgc2hhcGVzOiBpbnNldCAodGVybSB1c2VkIGZvciByZWN0YW5nbGUpLCBjaXJjbGUsXG4gICAgICAgIC8vICAgICAgICAgIGVsbGlwc2UsIHBvbHlnb24sIHBhdGggLSB3ZSB3aWxsIG9ubHkgY29uY2VybiBvdXJzZWx2ZXMgd2l0aCBpbnNldFxuICAgICAgICAvLyAgICAgIFRoZXJlIGFyZSA3IGJveCB2YWx1ZXM6IG1hcmdpbi1ib3gsIGJvcmRlci1ib3gsIHBhZGRpbmctYm94LCBjb250ZW50LWJveCwgZmlsbC1ib3gsIHN0cm9rZS1ib3gsIHZpZXctYm94XG4gICAgICAgIC8vICAgICAgQm94IGFuZCBzaGFwZSB2YWx1ZXMgbWF5IGJlIGNvbWJpbmVkOiBjbGlwLXBhdGg6IHBhZGRpbmctYm94IGNpcmNsZSg1MHB4IGF0IDAgMTAwcHgpO1xuICAgICAgICAvLyAgICAgIE5PVEU6IHRoZSBib3ggdmFsdWVzIGFyZSBOT1QgaW50dWl0aXZlLCBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2hhcGVzL0Zyb21fYm94X3ZhbHVlcyNtYXJnaW4tYm94XG4gICAgICAgIC8vICAgICAgXG4gICAgICAgIC8vICAgICAgU28gdGhlIGtleSBxdWVzdGlvbiBpcyB3aGF0IGFtb3VudCBvZiBlZmZvcnQgZG8gd2Ugd2FudCB0byBpbnZlc3QgaW50byBjbGlwLXBhdGhcbiAgICAgICAgLy8gXG5cbiAgICAgICAgLy8gSkNIIGRvbid0IGRvIGNsaXAtcGF0aCBub3cgXG4gICAgICAgIGxldCBjbGlwUGF0aEhlaWdodCA9IC0xO1xuICAgICAgICAvLyBpZiAoc3R5bGUuY2xpcFBhdGggIT09IFwiYXV0b1wiKSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoID0gXCIsc3R5bGUuY2xpcFBhdGgpO1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJzdHlsZS5jbGlwUGF0aC50b1N0cmluZyA9IFwiLHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCkpO1xuICAgICAgICAvLyAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwUGF0aC50b1N0cmluZygpO1xuICAgICAgICAvLyAgICAgaWYgKGNsaXBTdHJpbmcuaW5jbHVkZXMoXCJpbnNldFwiKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciByZUJyYWNrZXRzID0gL1xcKCguKilcXCkvZztcbiAgICAgICAgLy8gICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgLy8gICAgICAgdmFyIGZvdW5kID0gcmVCcmFja2V0cy5leGVjKGNsaXBTdHJpbmcpO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmRBcnIgPSBmb3VuZFsxXS5zcGxpdCgnICcpO1xuICAgICAgICAvLyAgICAgICBmb3IgKGxldCBpPTA7IGk8Zm91bmRBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAvLyAgICAgICAgIGxpc3RPZlRleHQucHVzaChmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgIH07XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgIC8vIGNsaXBQYXRoSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGlwUGF0aEhlaWdodCA9IFwiLCBjbGlwUGF0aEhlaWdodCk7XG5cbiAgICAgICAgLy8gaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgc3R5bGUuY2xpcCA9PT0gXCJyZWN0KDBweCwgMHB4LCAwcHgsIDBweClcIiAmJiBzdHlsZS5vdmVyZmxvdyAhPT0gXCJ2aXNpYmxlXCIpIHtcbiAgICAgICAgLy8gSkNIIGFyYml0cmFyaWx5IHVzZSBsZXNzIHRoYXQgN3B4IGZvciBjbGlwSGVpZ2h0XG4gICAgICAgIGlmIChzdHlsZS5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiICYmIGNsaXBIZWlnaHQgPCA3ICYmIGNsaXBIZWlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRPIE5PVCBDSEVDSyBDT0xPUiBDT05UUkFTVCBiZWNhdXNlIHRvbyBzbWFsbFwiKTtcbiAgICAgICAgICAgIC8vIENvcm5lciBjYXNlIHdoZXJlIGl0ZW0gaXMgaGlkZGVuIChhY2Nlc3NpYmlsaXR5IGhpZGluZyB0ZWNobmlxdWUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRmlyc3QgZGV0ZXJtaW5lIHRoZSBjb2xvciBjb250cmFzdCByYXRpb1xuICAgICAgICBsZXQgY29sb3JDb21ibyA9IENvbG9yVXRpbC5Db2xvckNvbWJvKGVsZW0pO1xuICAgICAgICBpZiAoY29sb3JDb21ibyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy9zb21lIGV4Y2VwdGlvbiBvY2N1cnJlZCwgb3Igbm90IGFibGUgdG8gZ2V0IGNvbG9yIGNvbWJvIGZvciBzb21lIHJlYXNvblxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmFibGUgdG8gZ2V0IGNvbG9yIGNvbWJvIGZvciBlbGVtZW50OiBcIiArIGVsZW0ubm9kZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmZyA9IGNvbG9yQ29tYm8uZmc7XG4gICAgICAgIGxldCBiZyA9IGNvbG9yQ29tYm8uYmc7XG4gICAgICAgIGxldCByYXRpbyA9IGZnLmNvbnRyYXN0UmF0aW8oYmcpO1xuICAgICAgICBsZXQgd2VpZ2h0ID0gQ1NTVXRpbC5nZXRXZWlnaHROdW1iZXIoc3R5bGUuZm9udFdlaWdodCk7XG4gICAgICAgIGxldCBzaXplID0gQ1NTVXRpbC5nZXRGb250SW5QaXhlbHMoc3R5bGUuZm9udFNpemUsIGVsZW0pO1xuICAgICAgICBsZXQgaXNMYXJnZVNjYWxlID0gc2l6ZSA+PSAyNCB8fCBzaXplID49IDE4LjYgJiYgd2VpZ2h0ID49IDcwMDtcbiAgICAgICAgXG4gICAgICAgIGlmIChDU1NVdGlsLmNvbnRhaW5zQ0tKKGNoaWxkU3RyKSkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FjdC1ydWxlcy9hY3QtcnVsZXMuZ2l0aHViLmlvL3B1bGwvMjEyMS9maWxlc1xuICAgICAgICAgICAgLy8gZm9yIENKSywgMjIgcHQgb3IgMTggcHQgd2l0aCBmb250LXdlaWdodCA+PSA3MDAsIDFwdCA9IDEuMzMzIHB4XG4gICAgICAgICAgICBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI5LjMgfHwgc2l6ZSA+PSAyNCAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICB9ICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gcmF0aW8gPj0gNC41IHx8IChyYXRpbyA+PSAzICYmIGlzTGFyZ2VTY2FsZSk7XG4gICAgICAgIGxldCBoYXNCYWNrZ3JvdW5kID0gY29sb3JDb21iby5oYXNCR0ltYWdlIHx8IGNvbG9yQ29tYm8uaGFzR3JhZGllbnQ7XG4gICAgICAgIGxldCB0ZXh0U2hhZG93ID0gY29sb3JDb21iby50ZXh0U2hhZG93O1xuICAgICAgICBsZXQgaXNEaXNhYmxlZCA9IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQoZWxlbSk7XG4gICAgICAgIGlmICghaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgbGV0IGNvbnRyb2wgPSBDb21tb25VdGlsLmdldENvbnRyb2xPZkxhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkID0gQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChjb250cm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIG5vZGVOYW1lID09PSAnbGFiZWwnICYmIENvbW1vblV0aWwuaXNEaXNhYmxlZEJ5Rmlyc3RDaGlsZEZvcm1FbGVtZW50KGVsZW0pKSB7XG4gICAgICAgICAgICBpc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEaXNhYmxlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBDb21tb25VdGlsLmlzRGlzYWJsZWRCeVJlZmVycmluZ0VsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiRVhUX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFcIiwge1xuICAgICAgICAgICAgXCJyYXRpb1wiOiByYXRpbyxcbiAgICAgICAgICAgIFwiaXNMYXJnZVNjYWxlXCI6IGlzTGFyZ2VTY2FsZSxcbiAgICAgICAgICAgIFwid2VpZ2h0XCI6IHdlaWdodCxcbiAgICAgICAgICAgIFwic2l6ZVwiOiBzaXplLFxuICAgICAgICAgICAgXCJoYXNCYWNrZ3JvdW5kXCI6IGhhc0JhY2tncm91bmQsXG4gICAgICAgICAgICBcImlzRGlzYWJsZWRcIjogaXNEaXNhYmxlZFxuICAgICAgICB9KTsqL1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgZWxlbWVudCBvciBwYXJlbnQgaXMgZGlzYWJsZWQsIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSAoYnV0IG1heSBiZSAzOjEgaW4gZnV0dXJlKVxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBpZiAoaGFzQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgcG90ZW50aWFsIHNpbmNlIGEgdGV4dCBvbiBhbiBpbWFnZSBvciBncmFkaWVudCBtYXkgYmUgc3RpbGwgdmlld2FibGUsIGRlcGVuZGluZyBvbiB0aGUgdGV4dCBsb2NhdGlvbiBvbiB0aGUgZ3JhZGllbnQgb3IgaW1hZ2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodF0pOztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dFNoYWRvdykge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgcG90ZW50aWFsIHNpbmNlIGEgdGV4dCB3aXRoIHNoYWRvdyBtYXkgYmUgc3RpbGwgdmlld2FibGUsIGRlcGVuZGluZyBvbiB0aGUgc2hhZG93IGVmZmZlY3RzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dF9zaGFkb3dcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodF0pOztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZnLnRvSGV4KCkgPT09IGJnLnRvSGV4KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfc2FtZV9jb2xvclwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0LCBmZy50b0hleCgpLCBiZy50b0hleCgpLCBjb2xvckNvbWJvLmhhc0JHSW1hZ2UsIGNvbG9yQ29tYm8uaGFzR3JhZGllbnRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2NvbnRyYXN0XCIsIFtyYXRpby50b0ZpeGVkKDIpLCBzaXplLCB3ZWlnaHQsIGZnLnRvSGV4KCksIGJnLnRvSGV4KCksIGNvbG9yQ29tYm8uaGFzQkdJbWFnZSwgY29sb3JDb21iby5oYXNHcmFkaWVudF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIsIFtyYXRpby50b0ZpeGVkKDIpLCBzaXplLCB3ZWlnaHQsIGZnLnRvSGV4KCksIGJnLnRvSGV4KCksIGNvbG9yQ29tYm8uaGFzQkdJbWFnZSwgY29sb3JDb21iby5oYXNHcmFkaWVudF0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGV4dF9xdW90ZWRfY29ycmVjdGx5OiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJJZiB0aGUgZm9sbG93aW5nIHRleHQgaXMgYSBxdW90YXRpb24sIG1hcmsgaXQgYXMgYSA8cT4gb3IgPGJsb2NrcXVvdGU+IGVsZW1lbnQ6IHswfVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlF1b3RhdGlvbnMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBpZiB0aGUgbm9kZSBpcyBoaWRkZW5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpICkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBib2R5XG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCJdKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBtaW5Xb3Jkczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAzLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1pbldvcmRzID0gdmFsaWRhdGVQYXJhbXMubWluV29yZHMudmFsdWU7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgbGV0IHZpb2xhdGVkdGV4dCA9IG51bGw7XG4gICAgICAgIC8vIGlnbm9yZSB0aGUgY2hlY2sgZm9yIHRoZSB0ZXh0IG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHNcbiAgICAgICAgY29uc3QgaWdub3JlZCA9IFtcImJsb2NrcXVvdGVcIiwgXCJxXCIsIFwic2NyaXB0XCIsIFwic3R5bGVcIiwgXCJwcmVcIiwgXCJjb2RlXCIsIFwicnVieVwiLCBcInNhbXBcIl07XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHR4dFZhbCA9IHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAvLyBEbyB0aGUgcmVnZXggdGVzdHMgZmlyc3QgLSBzaG91bGQgYmUgZmFzdFxuXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFwb3N0cm9waGUnc1xuICAgICAgICAgICAgICAgIHR4dFZhbCA9IHR4dFZhbC5yZXBsYWNlKC8oXFxTKScoXFxTKS9nLCBcIiQxJDJcIik7XG4gICAgICAgICAgICAgICAgbGV0IGRibFF1b3RlcyA9IHR4dFZhbC5tYXRjaCgvKFwiW15cIl0rXCIpL2cpO1xuICAgICAgICAgICAgICAgIGxldCBzbmdsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oJ1teJ10rJykvZyk7XG4gICAgICAgICAgICAgICAgLy8gV2FsayB0aGUgcGFyZW50cyAtIG9ubHkgY29udGludWUgdGVzdGluZyBpZiB3ZSBmb3VuZCBhIHF1b3RlLCBidXRcbiAgICAgICAgICAgICAgICAvLyB3ZSdyZSBub3QgYWxyZWFkeSBtYXJrZWQgdXBcbiAgICAgICAgICAgICAgICAvLyBBbHNvIHNraXAgaWYgd2UncmUgaW4gYSBzY3JpcHQgLSB0aGVyZSdzIGxvdHMgb2YgcXVvdGVzIHVzZWQgaW4gc2NyaXB0c1xuICAgICAgICAgICAgICAgIGlmICgoZGJsUXVvdGVzICE9PSBudWxsIHx8IHNuZ2xRdW90ZXMgIT09IG51bGwpICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3Iod2Fsa05vZGUsIGlnbm9yZWQpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgZGJsUXVvdGVzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwud29yZENvdW50KGRibFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc25nbFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBzbmdsUXVvdGVzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwud29yZENvdW50KHNuZ2xRdW90ZXNbaV0pIDwgbWluV29yZHM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IGxpbmVmZWVkIGluc2lkZSB0aGUgcXVvdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdmlvbGF0ZWR0ZXh0ID0gdHh0VmFsLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsXCJnXCIpLFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGJsUXVvdGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aW9sYXRlZHRleHQgPSBzbmdsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNuZ2xRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IGRibFF1b3Rlcy5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IGRibFF1b3Rlcy5jb25jYXQoc25nbFF1b3Rlcykuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgdmlvbGF0ZWR0ZXh0IGlzIGxvbmdlciB0aGFuIDY5IGNoYXJzLCBvbmx5IGtlZXAgdGhlIGZpcnN0IDMyLCB0aGUgXCIgLi4uIFwiLCBhbmQgdGhlIGxhc3QgMzIgY2hhcnMgXG4gICAgICAgIGlmICghcGFzc2VkICYmIHZpb2xhdGVkdGV4dC5sZW5ndGggJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCA+IDY5KSB7XG4gICAgICAgICAgICB2aW9sYXRlZHRleHQgPSB2aW9sYXRlZHRleHQuc3Vic3RyaW5nKDAsIDMyKSArIFwiIC4uLiBcIiArIHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcodmlvbGF0ZWR0ZXh0Lmxlbmd0aCAtIDMyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbdmlvbGF0ZWR0ZXh0XSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3NlbnNvcnlfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfc2Vuc29yeV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5LCBkb206Ym9keSBkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RleHRfU2Vuc29yeVJlZmVyZW5jZVwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfcG9zaXRpb24sIHBvdGVudGlhbF9vdGhlclwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcInRleHRfc2Vuc29yeV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcG9zaXRpb25cIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX290aGVyXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJJbnN0cnVjdGlvbnMgYXJlIG1lYW5pbmdmdWwgd2l0aG91dCByZWx5aW5nIHNvbGVseSBvbiBzaGFwZSwgc2l6ZSwgb3IgbG9jYXRpb24gd29yZHNcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Bvc2l0aW9uXCI6IFwiQ29uZmlybSB0aGUgd29yZChzKSAnezB9JyBvZiB0aGUgdXNlciBpbnN0cnVjdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIGEgbG9naWNhbCByYXRoZXIgdGhhbiB2aXN1YWwgcG9zaXRpb25cIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX290aGVyXCI6IFwiQ29uZmlybSB0aGUgdXNlciBpbnN0cnVjdGlvbiBpcyBzdGlsbCB1bmRlcnN0YW5kYWJsZSB3aXRob3V0IHRoZSB3b3JkKHMpICd7MH0nXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBtZWFuaW5nZnVsIHdpdGhvdXQgcmVseWluZyBzb2xlbHkgb24gc2hhcGUsIHNpemUsIG9yIGxvY2F0aW9uIHdvcmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBFeHRyYWN0IHRoZSBub2RlTmFtZSBvZiB0aGUgY29udGV4dCBub2RlXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCJdKSA9PT0gbnVsbCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBzY3JpcHQsIGxpbmssIGxhYmVsIGFuZCB0aGVpciBjaGlsZCBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwiYVwiLCAnbGFiZWwnXSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBcbiAgICAgICAgLy8gaWdub3JlIHRleHQgb24gbGFuZG1hcmsgcm9sZXMsIGJ1dCBub3Qgb24gdGhlaXIgY2hpbGRyZW4gKGUuZy4sIHNlY3Rpb24sIG1haW4pXG4gICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgbGV0IGxtUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlc1dpdGhUeXBlcyhydWxlQ29udGV4dCwgW1wibGFuZG1hcmtcIl0pO1xuICAgICAgICAgICAgaWYgKGxtUm9sZXMgJiYgbG1Sb2xlcy5pbmNsdWRlcyhyb2xlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBhbGwgd2lkZ2V0cyBhbmQgaGVhZGluZ3MsIGFuZCB0aGVpciBjaGlsZHJlbiwgYW5kIGNlcnRhaW4gc3RydWN0dXJlIHJvbGVzXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKHJ1bGVDb250ZXh0LCBbXCJ3aWRnZXRcIiwgXCJoZWFkaW5nXCJdKTtcbiAgICAgICAgLy8gYWRkIHNvbWUgc3RydWN0dXJlIHJvbGVzXG4gICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvZGVcIiwgXCJjb2x1bW5oZWFkZXJcIiwgXCJkZWZpbml0aW9uXCIsIFwiZmlndXJlXCIsIFwibGlzdFwiLCBcImxpc3RpdGVtXCIsIFwibWF0aFwiLCBcIm1ldGVyXCIsIFwicm93XCIsIFwicm93Z3JvdXBcIiwgXCJyb3doZWFkZXJcIiwgXCJ0ZXJtXCJdLCByb2xlcyk7XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlcyhydWxlQ29udGV4dCwgcm9sZXMpICE9PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCB2aW9sYXRlZFBvc2l0aW9uVGV4dCA9IFwiXCI7XG4gICAgICAgIGxldCB2aW9sYXRlZE90aGVyVGV4dCA9IFwiXCI7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgbGV0IHR4dFZhbCA9IFwiXCI7IFxuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIGZvciBlYWNoIGVsZW1lbnQgaXQgb25seSBjaGVja3MgdGhhdCBzaW5nbGUgZWxlbWVudHMgdGV4dCBub2RlcyBhbmQgbm90aGluZyBlbHNlLiBcbiAgICAgICAgICAgIC8vIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlIGNvdmVyZWQgb24gdGhlaXIgb3duLiBcbiAgICAgICAgICAgIC8vIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoc3BhY2UsIG5ld2xpbmUsIHRhYikgYmV0d2VlbiBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCBhIG5vZGUgdG9vLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0ID0gd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodHh0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHR4dFZhbCArPSAodHh0VmFsLmxlbmd0aCA+IDAgPyBcIiwgXCIgKyB0eHQgOiB0eHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHR4dFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgLy8gZmlyc3QgdG8gcmVtb3ZlIGVhY2ggZXhlbXB0IHdvcmQgd2l0aCBhIHNpbmdsZSBzcGFjZSBpbiB0aGUgdGV4dFxuICAgICAgICAgICAgbGV0IGV4ZW1wdFJlZ2V4ID0gZ2V0UmVnZXgocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJleGVtcHRUZXh0XCIpO1xuICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoZXhlbXB0UmVnZXgsIFwiIFwiKTtcblxuICAgICAgICAgICAgdmlvbGF0ZWRQb3NpdGlvblRleHQgPSBnZXRWaW9sYXRlZFRleHQocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJwb3NpdGlvblRleHRcIiwgdHh0VmFsKTtcbiAgICAgICAgICAgIHZpb2xhdGVkT3RoZXJUZXh0ID0gZ2V0VmlvbGF0ZWRUZXh0KHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwib3RoZXJUZXh0XCIsIHR4dFZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0ID0gW107IFxuICAgICAgICBpZiAodmlvbGF0ZWRQb3NpdGlvblRleHQpIHJldC5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfcG9zaXRpb25cIiwgW3Zpb2xhdGVkUG9zaXRpb25UZXh0XSkpO1xuICAgICAgICBpZiAodmlvbGF0ZWRPdGhlclRleHQpIHJldC5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3RoZXJcIiwgW3Zpb2xhdGVkT3RoZXJUZXh0XSkpO1xuICAgICAgICByZXR1cm4gcmV0Lmxlbmd0aCA9PSAwID8gbnVsbCA6IHJldDtcbiAgICB9XG59XG5cbmNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgIHBvc2l0aW9uVGV4dDoge1xuICAgICAgICB2YWx1ZTogW1widG9wLWxlZnRcIiwgXCJ0b3AtcmlnaHRcIiwgXCJib3R0b20tcmlnaHRcIiwgXCJib3R0b20tbGVmdFwiLFxuICAgICAgICAgICAgXCJ0b3AtdG8tYm90dG9tXCIsIFwibGVmdC10by1yaWdodFwiLCBcImJvdHRvbS10by10b3BcIiwgXCJyaWdodC10by1sZWZ0XCIsXG4gICAgICAgICAgICBcInJpZ2h0XCIsIFwibGVmdFwiLCBcImFib3ZlXCIsIFwiYmVsb3dcIiwgXCJ0b3BcIiwgXCJib3R0b21cIixcbiAgICAgICAgICAgIFwidXBwZXJcIiwgXCJsb3dlclwiLCBcImNvcm5lclwiLCBcImJlc2lkZVwiXG4gICAgICAgIF0sXG4gICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgIH0sXG4gICAgb3RoZXJUZXh0OiB7XG4gICAgICAgIHZhbHVlOiBbXCJyb3VuZFwiLCBcInNxdWFyZVwiLCBcInNoYXBlXCIsIFwicmVjdGFuZ2xlXCIsIFwidHJpYW5nbGVcIixcbiAgICAgICAgICAgIFwic2l6ZVwiLCBcImxhcmdlXCIsIFwic21hbGxcIiwgXCJtZWRpdW1cIiwgXCJiaWdcIiwgXCJodWdlXCIsIFwidGlueVwiLCBcImV4dHJhXCIsXG4gICAgICAgICAgICBcImxhcmdlclwiLCBcInNtYWxsZXJcIiwgXCJiaWdnZXJcIiwgXCJsaXR0bGVcIiwgXCJsYXJnZXN0XCIsIFwic21hbGxlc3RcIiwgXCJiaWdnZXN0XCJcbiAgICAgICAgXSxcbiAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgfSxcbiAgICBleGVtcHRUZXh0OiB7XG4gICAgICAgIHZhbHVlOiBbXCJyaWdodC1jbGlja1wiLCBcImxlZnQtY2xpY2tcIiwgXCJyaWdodC1jbGlja2luZ1wiLCBcInJpZ2h0LWNsaWNrc1wiLCBcbiAgICAgICAgICAgXCJsZWZ0LWNsaWNraW5nXCIsIFwibGVmdC1jbGlja3NcIiwgXCJzcXVhcmUgcm9vdFwiLCBcInJpZ2h0IG5vd1wiLCBcIm9mZiB0aGUgdG9wXCIgICAvL2FwcGVuZCBhcyBuZWVkZWRcbiAgICAgICAgXSxcbiAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgfSAgICBcbn1cblxuZnVuY3Rpb24gZ2V0UmVnZXgoZG9jLCB0eXBlKSB7XG4gICAgaWYgKCF2YWxpZGF0ZVBhcmFtc1t0eXBlXSkgcmV0dXJuIFwiXCI7XG4gICAgbGV0IHNlbnNvcnlSZWdleCA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIHR5cGUgKyBcIl9zZW5zb3J5X21pc3VzZVwiLCBudWxsKTtcbiAgICBpZiAoc2Vuc29yeVJlZ2V4ID09IG51bGwpIHtcbiAgICAgICAgbGV0IHNlbnNvcnlUZXh0ID0gdmFsaWRhdGVQYXJhbXNbdHlwZV0udmFsdWU7XG4gICAgICAgIGxldCByZWdleFN0ciA9IFwiKFxcc1xccyt8XCIgKyBzZW5zb3J5VGV4dFswXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBzZW5zb3J5VGV4dC5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHdvcmRzID0gc2Vuc29yeVRleHRbal0udHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIHJlZ2V4U3RyICs9IFwifFwiICsgd29yZHNbMF07XG4gICAgICAgICAgICBpZiAod29yZHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAxOyBjIDwgd29yZHMubGVuZ3RoOyArK2MpXG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4U3RyICs9IFwiICtcIiArIHdvcmRzW2NdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vcmVnZXhTdHIgKz0gXCIpXFxcXFdcIjtcbiAgICAgICAgcmVnZXhTdHIgKz0gXCIpXCI7XG4gICAgICAgIHNlbnNvcnlSZWdleCA9IG5ldyBSZWdFeHAocmVnZXhTdHIsIFwiZ2lcIik7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIHR5cGUgK1wiX3NlbnNvcnlfbWlzdXNlXCIsIHNlbnNvcnlSZWdleCk7XG4gICAgfVxuICAgIHJldHVybiBzZW5zb3J5UmVnZXg7XG59XG5cbmZ1bmN0aW9uIGdldFZpb2xhdGVkVGV4dChkb2MsIHR5cGUsIHR4dFZhbCkge1xuICAgIGlmICghdHh0VmFsKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgc2Vuc29yeVRleHRBcnIgPSB2YWxpZGF0ZVBhcmFtc1t0eXBlXS52YWx1ZVxuICAgIGxldCBoYXNoID0ge30sIHJlc3VsdCA9IFtdO1xuICAgIFxuICAgIC8vIHNwbGl0IHRoZSBzdHJpbmcgaW50byB3b3Jkc1xuICAgIGxldCBjb3VudHMgPSB0eHRWYWwuc3BsaXQoL1xccysvKS5yZWR1Y2UoZnVuY3Rpb24gKG1hcCwgd29yZCkge1xuICAgICAgICBsZXQgd29yZFdvVHJhaWxpbmdQdW5jID0gd29yZC5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXSskLywgXCJcIik7XG4gICAgICAgIGxldCBsY1dvcmRXb1B1bmMgPSB3b3JkLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy4/ITo7KCknXCIsYFxcXV0vZywgXCJcIik7XG5cbiAgICAgICAgZm9yIChsZXQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBzZW5zb3J5VGV4dEFyci5sZW5ndGg7IGNvdW50ZXIrKykge1xuICAgICAgICAgICAgbGV0IGEgPSBsY1dvcmRXb1B1bmMuaW5kZXhPZihzZW5zb3J5VGV4dEFycltjb3VudGVyXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBzZW5zb3J5V29yZExlbiA9IHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjaGFyRm9sbG93U2Vuc29yeVRleHQgPSBsY1dvcmRXb1B1bmMuY2hhckF0KHNlbnNvcnlXb3JkTGVuICsgYSk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSB3b3JkIGRvZXMgbm90IGNvbnRhaW5zIHN1YnN0cmluZyBvZiBzZW5zb3J5VGV4dEFycltjb3VudGVyXVxuICAgICAgICAgICAgLy8gcHJvY2VlZCB0byB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbiBmb3IgbmV4dCBzZW5zb3J5VGV4dC5cbiAgICAgICAgICAgIGlmIChhIDwgMCkgeyBjb250aW51ZTsgfVxuXG4gICAgICAgICAgICAvL2NoZWNrIHRoZSBmb2xsb3dpbmcgYW5kIHByb2NlZWRpbmcgcHVuY3R1YXRpb25zXG4gICAgICAgICAgICAvL2xldCBpc1B1bmNmb2xsb3dpbmcgPSAoKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFwtJykgfHxcbiAgICAgICAgICAgIGxldCBpc1B1bmNmb2xsb3dpbmcgPSAoXG4gICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXD8nKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcOicpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcOycpIHx8XG4gICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFwoJykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCcnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCwnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICcuXFxgJykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXFxcJykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICBsZXQgaXNQdW5jUHJlY2VkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYSA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9IGxjV29yZFdvUHVuYy5jaGFyQXQoYSAtIDEpO1xuICAgICAgICAgICAgICAgIGlzUHVuY1ByZWNlZGluZyA9ICgoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwtJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcLicpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXD8nKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwhJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOicpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXDsnKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwoJykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcKScpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCcnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxcIicpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnLlxcYCcpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXFxcJykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXScpKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKChsY1dvcmRXb1B1bmMubGVuZ3RoID09IHNlbnNvcnlXb3JkTGVuKSB8fCAoaXNQdW5jZm9sbG93aW5nID09IHRydWUpIHx8IChpc1B1bmNQcmVjZWRpbmcgPT0gdHJ1ZSkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KHdvcmRXb1RyYWlsaW5nUHVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzaFt3b3JkV29UcmFpbGluZ1B1bmNdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2god29yZFdvVHJhaWxpbmdQdW5jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY291bnRlciA9IHNlbnNvcnlUZXh0QXJyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXBbd29yZFdvVHJhaWxpbmdQdW5jXSA9IChtYXBbd29yZFdvVHJhaWxpbmdQdW5jXSB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiLCBcIik7XG59ICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfc3BhY2luZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3NwYWNpbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sZXR0ZXJfc3BhY2luZ19zdHlsZVwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfd29yZF9zcGFjaW5nX3N0eWxlXCI6IFwidGV4dF9zcGFjaW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJDU1MgIWltcG9ydGFudCBpcyBub3QgdXNlZCBpbiBpbmxpbmUgc3R5bGUgdG8gY29udHJvbCBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nIG9yIGxpbmUgaGVpZ2h0XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSBzdHlsZSB0byBjb250cm9sIGxldHRlciBvciB3b3JkIHNwYWNpbmcgb3IgbGluZSBoZWlnaHRcIixcbiAgICAgICAgICAgIFwiZmFpbF9sZXR0ZXJfc3BhY2luZ19zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYbGV0dGVyLXNwYWNpbmfigJkgc3R5bGVcIixcbiAgICAgICAgICAgIFwiZmFpbF93b3JkX3NwYWNpbmdfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmHdvcmQtc3BhY2luZ+KAmSBzdHlsZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xpbmVfaGVpZ2h0X3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJhsaW5lLWhlaWdodOKAmSBzdHlsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgICBcIm51bVwiOiBbXCIxLjQuMTJcIl0sXG4gICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6Wyc5ZTQ1ZWMnLCAnMjRhZmMyJywgJzc4ZmQzMiddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIG9mZiBzY3JlZW5cbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoYm91bmRzWyd0b3AnXSA8IDAgfHwgYm91bmRzWydsZWZ0J10gPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIG5vLWh0bWwgZWxlbWVudFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IFwiXCI7XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gcnVsZUNvbnRleHQuY2hpbGROb2RlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRTdHIgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vZm9udCBzaXplIGFsd2F5cyByZXNvbHZlZCB0byAncHgnICAgIFxuICAgICAgICBjb25zdCBmb250X3NpemVfc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKTtcbiAgICAgICAgbGV0IGZvbnRfc2l6ZSA9IHBhcnNlRmxvYXQoZm9udF9zaXplX3N0eWxlKTsgXG4gICAgICAgIFxuICAgICAgICBjb25zdCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3R5bGVzKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vbm90ZSB0aGF0IENTUyB1bml0IGlzIHJlcXVpcmVkIGZvciBub24temVybyB2YWx1ZXMsIG90aGVyd2lzZSBpdCdzIGlnbm9yZWRcbiAgICAgICAgbGV0IHJldCA9IFtdOyBcbiAgICAgICAgLy8gbWF0Y2hlZCBzdHJpbmc6IG9yaWdpbmFsIHN0eWxlLCB0aGUgc3R5bGUgdmFsdWUgYW5kIHVuaXRcbiAgICAgICAgY29uc3QgcmVnZXggPSAvKC0/W1xcZC5dKykoW2EteiVdKikvO1xuICAgICAgICBsZXQgd29yZF9zdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkX3N0eWxlKSB7XG4gICAgICAgICAgICBpZiAod29yZF9zdHlsZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgd29yZF9zdHlsZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY2xvc2V0IGFuY2VzdG9yJ3Mgd29yZC1zcGFjaW5nXG4gICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwge1wid29yZC1zcGFjaW5nXCI6IFtcIipcIl19LCBbJ2luaGVyaXQnLCAndW5zZXQnXSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRfc3R5bGUgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoYW5jZXN0b3IpWyd3b3JkLXNwYWNpbmcnXTsgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod29yZF9zdHlsZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRfc3R5bGUgPSBcImluaXRpYWxcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ICBcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoXCJ3b3JkLXNwYWNpbmdcIikgPT09ICdpbXBvcnRhbnQnKSB7XG4gICAgICAgICAgICAgICAgd29yZF9zdHlsZSA9IHdvcmRfc3R5bGUuc3Vic3RyaW5nKDAsIHdvcmRfc3R5bGUubGVuZ3RoIC0gXCIhaW1wb3J0YW50XCIubGVuZ3RoIC0xKTtcbiAgICAgICAgICAgICAgICAvLyBjb21wdXRlZCBzcGFjZSBpcyAwIGZvciAnbm9ybWFsJyBvciAnaW5pdGlhbCcuXG4gICAgICAgICAgICAgICAgaWYgKHdvcmRfc3R5bGUgPT09ICdpbml0aWFsJyB8fCB3b3JkX3N0eWxlID09PSAnbm9ybWFsJylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiKSk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRTcGFjaW5nID0gcGFyc2VGbG9hdCh3b3JkX3N0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTih3b3JkU3BhY2luZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSB3b3JkX3N0eWxlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkWzJdICE9PSAnJyAmJiBwYXJzZWRbMV0gIT09IDApIHsgLy9ubyB6ZXJvIHZhbHVlIHdpdGhvdXQgdW5pdCB3aGljaCBpcyBjb25zaWRlcmVkIGFzIGVycm9yLCBzbyBpbXBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpeGVscyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYXJzZWRbMl0sIHBhcnNlZFsxXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzL2ZvbnRfc2l6ZSA8IDAuMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF93b3JkX3NwYWNpbmdfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTsgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpOyAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpOyAgXG4gICAgICAgIH0gXG5cbiAgICAgICAgbGV0IGxldHRlcl9zdHlsZSA9IHN0eWxlc1snbGV0dGVyLXNwYWNpbmcnXTsgXG4gICAgICAgIGlmIChsZXR0ZXJfc3R5bGUpIHtcbiAgICAgICAgICAgIGlmIChsZXR0ZXJfc3R5bGUuc3RhcnRzV2l0aCgnaW5oZXJpdCcpIHx8IGxldHRlcl9zdHlsZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgY2xvc2V0IGFuY2VzdG9yJ3Mgd29yZC1zcGFjaW5nXG4gICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwge1wibGV0dGVyLXNwYWNpbmdcIjogW1wiKlwiXX0sIFsnaW5oZXJpdCcsICd1bnNldCddKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0dGVyX3N0eWxlID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKGFuY2VzdG9yKVsnbGV0dGVyLXNwYWNpbmcnXTsgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV0dGVyX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0dGVyX3N0eWxlID0gXCJpbml0aWFsXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoXCJsZXR0ZXItc3BhY2luZ1wiKSA9PT0gJ2ltcG9ydGFudCcpIHtcbiAgICAgICAgICAgICAgICBsZXR0ZXJfc3R5bGUgPSBsZXR0ZXJfc3R5bGUuc3Vic3RyaW5nKDAsIGxldHRlcl9zdHlsZS5sZW5ndGggLSBcIiFpbXBvcnRhbnRcIi5sZW5ndGggLTEpO1xuICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIHNwYWNlIGlzIDAgZm9yICdub3JtYWwnIG9yICdpbml0aWFsJy5cbiAgICAgICAgICAgICAgICBpZiAobGV0dGVyX3N0eWxlID09PSAnaW5pdGlhbCcgfHwgbGV0dGVyX3N0eWxlID09PSAnbm9ybWFsJylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclNwYWNpbmcgPSBwYXJzZUZsb2F0KGxldHRlcl9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obGV0dGVyU3BhY2luZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBsZXR0ZXJfc3R5bGUudHJpbSgpLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRbMl0gIT09ICcnICYmIHBhcnNlZFsxXSAhPT0gMCkgeyAvL25vIHplcm8gdmFsdWUgd2l0aG91dCB1bml0IHdoaWNoIGlzIGNvbnNpZGVyZWQgYXMgZXJyb3IsIHNvIGltcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGl4ZWxzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVscyAhPT0gbnVsbCAmJiBwaXhlbHMvZm9udF9zaXplIDwgMC4xMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgIH0gICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgfSBcblxuICAgICAgICBsZXQgbGluZV9zdHlsZSA9IHN0eWxlc1snbGluZS1oZWlnaHQnXTtcbiAgICAgICAgbGV0IG92ZXJmbG93ID0ge1wib3ZlcmZsb3dcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteFwiOlsnYXV0bycsICdzY3JvbGwnXSwgXCJvdmVyZmxvdy15XCI6WydhdXRvJywgJ3Njcm9sbCddfTtcbiAgICAgICAgaWYgKGxpbmVfc3R5bGUgJiYgQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQsIG92ZXJmbG93KSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGxpbmVfc3R5bGUuc3RhcnRzV2l0aCgnaW5oZXJpdCcpIHx8IGxpbmVfc3R5bGUuc3RhcnRzV2l0aCgndW5zZXQnKSkge1xuICAgICAgICAgICAgICAgIC8vZ2V0IGNsb3NldCBhbmNlc3RvcidzIHdvcmQtc3BhY2luZ1xuICAgICAgICAgICAgICAgIGxldCBhbmNlc3RvciA9IENTU1V0aWwuZ2V0QW5jZXN0b3JXaXRoU3R5bGVzKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQsIHtcImxpbmUtaGVpZ2h0XCI6IFtcIipcIl19LCBbJ2luaGVyaXQnLCAndW5zZXQnXSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVfc3R5bGUgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoYW5jZXN0b3IpWydsaW5lLWhlaWdodCddOyAgXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lX3N0eWxlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZV9zdHlsZSA9IFwiaW5pdGlhbFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoXCJsaW5lLWhlaWdodFwiKSA9PT0gJ2ltcG9ydGFudCcpIHtcbiAgICAgICAgICAgICAgICBsaW5lX3N0eWxlID0gbGluZV9zdHlsZS5zdWJzdHJpbmcoMCwgbGluZV9zdHlsZS5sZW5ndGggLSBcIiFpbXBvcnRhbnRcIi5sZW5ndGggLTEpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIHNwYWNlIGlzIDAgZm9yICdub3JtYWwnIG9yICdpbml0aWFsJy5cbiAgICAgICAgICAgICAgICBpZiAobGluZV9zdHlsZSA9PT0gJ2luaXRpYWwnIHx8IGxpbmVfc3R5bGUgPT09ICdub3JtYWwnKVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgIGVsc2UgeyAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBwYXJzZUZsb2F0KGxpbmVfc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGxpbmVIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gbGluZV9zdHlsZS50cmltKCkubWF0Y2gocmVnZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFsyXSA9PT0gJycpIHsgLy9saW5lLWhlaWdodCBhcmUgYWxsb3dlZCB1bml0bGVzcyB3aGVuIHRoZSB2YWxpZSBpcyBtdWx0aXBsZSAob3IgZnJhY3Rpb24pIG9mIHRoZSBmb250IHNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkWzFdIDwgMS41KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBpeGVscyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYXJzZWRbMl0sIHBhcnNlZFsxXSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzL2ZvbnRfc2l6ZSA8IDEuNSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xpbmVfaGVpZ2h0X3N0eWxlXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTsgXG4gICAgICAgIH0gXG4gICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgXG4gICAgICAgIHJldHVybiBudWxsOyAgLy9pbXBsaWNhYmxlIG9yIGlnbm9yZVxuICAgICAgICBcbiAgICB9ICAgIFxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3doaXRlc3BhY2VfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdGV4dFwiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwiU3BhY2UgY2hhcmFjdGVycyBzaG91bGQgbm90IGJlIHVzZWQgdG8gY3JlYXRlIHNwYWNlIGJldHdlZW4gdGhlIGxldHRlcnMgb2YgYSB3b3JkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU3BhY2UgY2hhcmFjdGVycyBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29udHJvbCBzcGFjaW5nIHdpdGhpbiBhIHdvcmRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdFxuICAgICAgICBsZXQgY2hlY2tBbmNlc3RvciA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIiwgXCJzY3JpcHRcIiwgXCJjb2RlXCJdKTtcbiAgICAgICAgaWYgKGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtOb2RlKSB7XG4gICAgICAgICAgICAvLyBDb21wbHkgdG8gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgd2lsbCBiZSBkb25lIGJ5IGRlZmF1bHQgYXMgdGhpcyBydWxlIHRyaWdnZXJzIG9uIGVhY2ggZWxlbWVudFxuICAgICAgICAgICAgLy8gYW5kIGZvciBlYWNoIGVsZW1lbnQgaXQgb25seSBjaGVja3MgdGhhdCBzaW5nbGUgZWxlbWVudHMgdGV4dCBub2RlcyBhbmQgbm90aGluZyBlbHNlLiBTbyBhbGwgaW5uZXIgZWxlbWVudHMgd2lsbCBiZVxuICAgICAgICAgICAgLy8gY292ZXJlZCBvbiB0aGVpciBvd24uIEN1cnJlbnRseSBmb3IgdGhpcyBydWxlIGJ5IGRlZmF1bHQgQ2hlY2sgSGlkZGVuIENvbnRlbnQgd2lsbCB3b3JrLCBhcyB3ZSBhcmUgZG9pbmdcbiAgICAgICAgICAgIC8vIGEgbm9kZSB3YWxrIG9ubHkgb24gc2libGluZ3Mgc28gaXQgd291bGQgbm90IGdldCB0ZXh0IG5vZGVzIGZyb20gb3RoZXIgc2libGluZ3MgYXQgYWxsLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgaW4gdGhlIGZ1dHVyZSBzb21ldGhpbmcgY2huZ2VzLCBqdXN0IG5lZWQgdG8gYWRkICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpIHRvIHRoZSBiZWxvd1xuICAgICAgICAgICAgLy8gaWYuXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHR4dFZhbCA9IHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhKC8oXnxcXHMpW2EtekEtWl0gW2EtekEtWl0gW2EtekEtWl0oJHxcXHMpLy50ZXN0KHR4dFZhbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3RleHRcIik7XG5cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHdpZGdldF90YWJiYWJsZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpsaW5rLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnRhYmxpc3QsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51LGFyaWE6cmFkaW9ncm91cCxhcmlhOnRyZWUsYXJpYTptZW51YmFyLCBhcmlhOmdyaWQsIGFyaWE6dHJlZWdyaWQsIGFyaWE6Y2hlY2tib3gsYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOnNjcm9sbGJhcixhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfRm9jdXNfVGFiYmFibGVcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwiZmFpbF9ub190YWJiYWJsZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIndpZGdldF90YWJiYWJsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgdGFiYmFibGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgLy8gQ29tcG9zaXRlIHVzZXIgaW50ZXJmYWNlIHdpZGdldCByb2xlcy4gVGhleSBhY3QgYXMgY29udGFpbmVycyB0aGF0IG1hbmFnZSBvdGhlciwgY29udGFpbmVkIHdpZGdldHMuXG4gICAgICAgIGxldCByb2xlQ29udGFpbmVycyA9IFtcImNvbWJvYm94XCIsIFwiZ3JpZFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidHJlZVwiLCBcInRyZWVncmlkXCJdO1xuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZUNvbnRhaW5lcnMpIHtcbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCByb2xlLCB0cnVlKSAhPSBudWxsKSBcbiAgICAgICAgICAgICAgICAvLyBpdCdzIGEgZGVzY2VuZGFudCBvZiBhIGNvbXBvc2l0ZSB3aWRnZXQgYWxyZWFkeSBleGFtaW5lZFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9ICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vIHNraXAgdGhlIGNvdW50IGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKGNvdW50IDwgMSAmJiAhQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgJiYgcnVsZUNvbnRleHQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy9sZXQgbncgPSBuZXcgTm9kZVdhbGtlcihydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDEgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50ID49IDE7XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwiZmFpbF9ub190YWJiYWJsZVwiLCBbcm9sZV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHdpZGdldF90YWJiYWJsZV9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOmNoZWNrYm94LGFyaWE6b3B0aW9uLGFyaWE6cmFkaW8sYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOmNvbHVtbmhlYWRlcixhcmlhOnJvd2hlYWRlcixhcmlhOnNsaWRlcixhcmlhOnRhYlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19NdWx0aVRhYlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJDb21wb25lbnRzIHdpdGggYSB3aWRnZXQgcm9sZSBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4gb25lIHRhYmJhYmxlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50cyB3aXRoIGEgd2lkZ2V0IHJvbGUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBsZXQgbmFtZSA9IFtdO1xuICAgICAgICBpZiAoY291bnQgPCAyICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAvL2xldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgd2hpbGUgKGNvdW50IDwgMiAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PSAxICYmICFudy5iRW5kVGFnICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSYWRpbyBpbnB1dHMgd2l0aCB0aGUgc2FtZSBuYW1lIG5hdGl2ZWx5IGFyZSBvbmx5IG9uZSB0YWIgc3RvcFxuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChudy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJOYW1lID0gKG53Lm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluY2x1ZGVzKGN1ck5hbWUpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLnB1c2goY3VyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50IDwgMjtcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLCBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL2FwaS9JR3VpZGVsaW5lXCI7XG5jb25zdCBTQ3MgPSBbXTtcbmZvciAoY29uc3Qga2V5IGluIFNDVVJMcykge1xuICAgIFNDcy5wdXNoKFNDVVJMc1trZXldKTtcbn1cblxuY29uc3Qgc3VtbWFyaWVzID0ge1xuICAgIFwiMS4xLjFcIjogXCJBbGwgbm9uLXRleHQgY29udGVudCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgc2VydmVzIHRoZSBlcXVpdmFsZW50IHB1cnBvc2UuXCIsXG4gICAgXCIxLjIuMVwiOiBcIkZvciBwcmVyZWNvcmRlZCBhdWRpby1vbmx5IG9yIHZpZGVvLW9ubHkgbWVkaWEsIGFuIGFsdGVybmF0aXZlIHByb3ZpZGVzIGVxdWl2YWxlbnQgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIxLjIuMlwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjNcIjogXCJBbiBhbHRlcm5hdGl2ZSBmb3IgdGltZS1iYXNlZCBtZWRpYSBvciBhdWRpbyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpcyBwcm92aWRlZCBmb3Igc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjRcIjogXCJDYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBsaXZlIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjVcIjogXCJBdWRpbyBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIHZpZGVvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4zLjFcIjogXCJJbmZvcm1hdGlvbiwgc3RydWN0dXJlLCBhbmQgcmVsYXRpb25zaGlwcyBjb252ZXllZCB0aHJvdWdoIHByZXNlbnRhdGlvbiBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIG9yIGFyZSBhdmFpbGFibGUgaW4gdGV4dC5cIixcbiAgICBcIjEuMy4yXCI6IFwiV2hlbiB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggY29udGVudCBpcyBwcmVzZW50ZWQgYWZmZWN0cyBpdHMgbWVhbmluZywgYSBjb3JyZWN0IHJlYWRpbmcgc2VxdWVuY2UgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZC5cIixcbiAgICBcIjEuMy4zXCI6IFwiSW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGZvciB1bmRlcnN0YW5kaW5nIGFuZCBvcGVyYXRpbmcgY29udGVudCBkbyBub3QgcmVseSBzb2xlbHkgb24gc2Vuc29yeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcG9uZW50cyBzdWNoIGFzIHNoYXBlLCBzaXplLCB2aXN1YWwgbG9jYXRpb24sIG9yaWVudGF0aW9uLCBvciBzb3VuZC5cIixcbiAgICBcIjEuMy40XCI6IFwiQ29udGVudCBkb2VzIG5vdCByZXN0cmljdCBpdHMgdmlldyBhbmQgb3BlcmF0aW9uIHRvIGEgc2luZ2xlIGRpc3BsYXkgb3JpZW50YXRpb24sIHN1Y2ggYXMgcG9ydHJhaXQgb3IgbGFuZHNjYXBlLlwiLFxuICAgIFwiMS4zLjVcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGlucHV0IGZpZWxkIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCB3aGVuIHRoZSBmaWVsZCBzZXJ2ZXMgYSBjb21tb24gcHVycG9zZS5cIixcbiAgICBcIjEuNC4xXCI6IFwiQ29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvbiwgaW5kaWNhdGluZyBhbiBhY3Rpb24sIHByb21wdGluZyBhIHJlc3BvbnNlLCBvciBkaXN0aW5ndWlzaGluZyBhIHZpc3VhbCBlbGVtZW50LlwiLFxuICAgIFwiMS40LjJcIjogXCJJZiBhbnkgYXVkaW8gcGxheXMgYXV0b21hdGljYWxseSBmb3IgbW9yZSB0aGFuIDMgc2Vjb25kcywgZWl0aGVyIGEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIHRoZSBhdWRpbywgb3IgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGNvbnRyb2wgYXVkaW8gdm9sdW1lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgb3ZlcmFsbCBzeXN0ZW0gdm9sdW1lIGxldmVsLlwiLFxuICAgIFwiMS40LjNcIjogXCJUaGUgdmlzdWFsIHByZXNlbnRhdGlvbiBvZiB0ZXh0IGFuZCBpbWFnZXMgb2YgdGV4dCBoYXMgYSBjb250cmFzdCByYXRpbyBvZiBhdCBsZWFzdCA0LjU6MSwgd2l0aCBhIDM6MSByYXRpbyBmb3IgbGFyZ2Utc2NhbGUgdGV4dC5cIixcbiAgICBcIjEuNC40XCI6IFwiVGV4dCBjYW4gYmUgcmVzaXplZCB3aXRob3V0IGFzc2lzdGl2ZSB0ZWNobm9sb2d5IHVwIHRvIDIwMCBwZXJjZW50IHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkuXCIsXG4gICAgXCIxLjQuNVwiOiBcIklmIHRoZSB0ZWNobm9sb2dpZXMgYmVpbmcgdXNlZCBjYW4gYWNoaWV2ZSB0aGUgdmlzdWFsIHByZXNlbnRhdGlvbiwgdGV4dCBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIHJhdGhlciB0aGFuIGltYWdlcyBvZiB0ZXh0LlwiLFxuICAgIFwiMS40LjEwXCI6IFwiQ29udGVudCBjYW4gcmVmbG93IHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbiBvciBmdW5jdGlvbmFsaXR5LCBhbmQgd2l0aG91dCByZXF1aXJpbmcgc2Nyb2xsaW5nIGluIHR3byBkaW1lbnNpb25zLlwiLFxuICAgIFwiMS40LjExXCI6IFwiVGhlIHBhcnRzIG9mIGdyYXBoaWNhbCBvYmplY3RzIHJlcXVpcmVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRlbnQsIGFuZCB0aGUgdmlzdWFsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGlkZW50aWZ5IFVJIGNvbXBvbmVudHMgYW5kIHN0YXRlcywgaGF2ZSBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDM6MSBhZ2FpbnN0IGFkamFjZW50IGNvbG9ycy5cIixcbiAgICBcIjEuNC4xMlwiOiBcIk5vIGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5IG9jY3VycyB3aGVuIHVzZXJzIGNoYW5nZSBsZXR0ZXIsIHdvcmQgYW5kIHBhcmFncmFwaCBzcGFjaW5nLCBhcyB3ZWxsIGFzIGxpbmUgaGVpZ2h0LlwiLFxuICAgIFwiMS40LjEzXCI6IFwiV2hlcmUgaG92ZXIgb3IgZm9jdXMgYWN0aW9ucyBjYXVzZSBhZGRpdGlvbmFsIGNvbnRlbnQgdG8gYmVjb21lIHZpc2libGUgYW5kIGhpZGRlbiwgdGhlIGFkZGl0aW9uYWwgY29udGVudCBpcyBkaXNtaXNzYWJsZSwgaG92ZXJhYmxlIGFuZCBwZXJzaXN0ZW50LlwiLFxuICAgIFwiMi4xLjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgY29udGVudCBpcyBvcGVyYWJsZSB0aHJvdWdoIGEga2V5Ym9hcmQgaW50ZXJmYWNlIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpZmljIHRpbWluZ3MgZm9yIGluZGl2aWR1YWwga2V5c3Ryb2tlcy5cIixcbiAgICBcIjIuMS4yXCI6IFwiSWYga2V5Ym9hcmQgZm9jdXMgY2FuIGJlIG1vdmVkIHRvIGEgY29tcG9uZW50IHVzaW5nIGEga2V5Ym9hcmQgaW50ZXJmYWNlLCB0aGVuIGZvY3VzIGNhbiBiZSBtb3ZlZCBhd2F5IGZyb20gdGhhdCBjb21wb25lbnQgdXNpbmcgb25seSBhIGtleWJvYXJkIGludGVyZmFjZSwgYW5kLCBpZiBpdCByZXF1aXJlcyBtb3JlIHRoYW4gdW5tb2RpZmllZCBhcnJvdyBvciB0YWIga2V5cyBvciBvdGhlciBzdGFuZGFyZCBleGl0IG1ldGhvZHMsIHRoZSB1c2VyIGlzIGFkdmlzZWQgb2YgdGhlIG1ldGhvZCBmb3IgbW92aW5nIGZvY3VzIGF3YXkuXCIsXG4gICAgXCIyLjEuNFwiOiBcIklmIGEga2V5Ym9hcmQgc2hvcnRjdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgb25seSBsZXR0ZXIsIHB1bmN0dWF0aW9uLCBudW1iZXIgb3Igc3ltYm9sIGNoYXJhY3RlcnMsIHRoZW4gdGhlIHNob3J0Y3V0IGNhbiBiZSB0dXJuZWQgb2ZmLCByZW1hcHBlZCBvciBhY3RpdmF0ZWQgb25seSBvbiBmb2N1cy5cIixcbiAgICBcIjIuMi4xXCI6IFwiRm9yIGVhY2ggdGltZSBsaW1pdCB0aGF0IGlzIHNldCBieSB0aGUgY29udGVudCwgdGhlIHVzZXIgY2FuIHR1cm4gb2ZmLCBhZGp1c3QsIG9yIGV4dGVuZCB0aGUgbGltaXQuXCIsXG4gICAgXCIyLjIuMlwiOiBcIkZvciBtb3ZpbmcsIGJsaW5raW5nLCBzY3JvbGxpbmcsIG9yIGF1dG8tdXBkYXRpbmcgaW5mb3JtYXRpb24sIHRoZSB1c2VyIGNhbiBwYXVzZSwgc3RvcCwgaGlkZSBvciBhZGp1c3QgdGhlIGluZm9ybWF0aW9uLlwiLFxuICAgIFwiMi4zLjFcIjogXCJDb250ZW50IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcgdGhhdCBmbGFzaGVzIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBpbiBhbnkgb25lIHNlY29uZCBwZXJpb2QsIG9yIHRoZSBmbGFzaCBpcyBiZWxvdyB0aGUgZ2VuZXJhbCBmbGFzaCBhbmQgcmVkIGZsYXNoIHRocmVzaG9sZHMuXCIsXG4gICAgXCIyLjQuMVwiOiBcIkEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzLlwiLFxuICAgIFwiMi40LjJcIjogXCJXZWIgcGFnZXMsIG5vbi13ZWIgZG9jdW1lbnRzLCBhbmQgc29mdHdhcmUgaGF2ZSB0aXRsZXMgdGhhdCBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjNcIjogXCJJZiBjb250ZW50IGNhbiBiZSBuYXZpZ2F0ZWQgc2VxdWVudGlhbGx5IGFuZCB0aGUgbmF2aWdhdGlvbiBzZXF1ZW5jZXMgYWZmZWN0IG1lYW5pbmcgb3Igb3BlcmF0aW9uLCBmb2N1c2FibGUgY29tcG9uZW50cyByZWNlaXZlIGZvY3VzIGluIGFuIG9yZGVyIHRoYXQgcHJlc2VydmVzIG1lYW5pbmcgYW5kIG9wZXJhYmlsaXR5LlwiLFxuICAgIFwiMi40LjRcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGxpbmsgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgbGluayB0ZXh0IGFsb25lIG9yIGZyb20gdGhlIGxpbmsgdGV4dCB0b2dldGhlciB3aXRoIGl0cyBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgbGluayBjb250ZW50LlwiLFxuICAgIFwiMi40LjVcIjogXCJNb3JlIHRoYW4gb25lIHdheSBpcyBhdmFpbGFibGUgdG8gbG9jYXRlIGEgV2ViIHBhZ2Ugd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcywgZXhjZXB0IHdoZXJlIHRoZSBXZWIgUGFnZSBpcyB0aGUgcmVzdWx0IG9mLCBvciBhIHN0ZXAgaW4sIGEgcHJvY2Vzcy5cIixcbiAgICBcIjIuNC42XCI6IFwiSGVhZGluZ3MgYW5kIGxhYmVscyBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjdcIjogXCJBbnkga2V5Ym9hcmQgb3BlcmFibGUgdXNlciBpbnRlcmZhY2UgaGFzIGEgbW9kZSBvZiBvcGVyYXRpb24gd2hlcmUgdGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlLlwiLFxuICAgIFwiMi40LjExXCI6IFwiV2hlbiBhbiBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLCBpdCBpcyBub3QgZW50aXJlbHkgY292ZXJlZCBieSBvdGhlciBjb250ZW50LlwiLFxuICAgIFwiMi41LjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSB0aGF0IHVzZXMgbXVsdGlwb2ludCBvciBwYXRoLWJhc2VkIGdlc3R1cmVzIGZvciBvcGVyYXRpb24gY2FuIGJlIG9wZXJhdGVkIHdpdGggYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGEgcGF0aC1iYXNlZCBnZXN0dXJlLlwiLFxuICAgIFwiMi41LjJcIjogXCJGb3IgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBvcGVyYXRlZCB1c2luZyBhIHNpbmdsZSBwb2ludGVyLCBjb21wbGV0aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBvbiB0aGUgdXAtZXZlbnQgd2l0aCBhbiBhYmlsaXR5IHRvIGFib3J0LCB1bmRvIG9yIHJldmVyc2UgdGhlIG91dGNvbWUuXCIsXG4gICAgXCIyLjUuM1wiOiBcIkZvciB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIHdpdGggbGFiZWxzIHRoYXQgaW5jbHVkZSB0ZXh0IG9yIGltYWdlcyBvZiB0ZXh0LCB0aGUgYWNjZXNzaWJsZSBuYW1lIGNvbnRhaW5zIHRoZSB0ZXh0IHRoYXQgaXMgcHJlc2VudGVkIHZpc3VhbGx5LlwiLFxuICAgIFwiMi41LjRcIjogXCJGdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIGJ5IG1vdGlvbiBjYW4gYWxzbyBiZSBvcGVyYXRlZCBieSB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzLCBhbmQgdGhlIG1vdGlvbiB0cmlnZ2VyIGNhbiBiZSBkaXNhYmxlZC5cIixcbiAgICBcIjIuNS44XCI6IFwiVGhlIHNpemUgb2YgdGhlIHRhcmdldCBmb3IgcG9pbnRlciBpbnB1dHMgaXMgYXQgbGVhc3QgMjQgYnkgMjQgQ1NTIHBpeGVscy5cIixcbiAgICBcIjIuNS43XCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgdGhhdCB1c2VzIGEgZHJhZ2dpbmcgbW92ZW1lbnQgZm9yIG9wZXJhdGlvbiBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGRyYWdnaW5nLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4yLjZcIjogXCJNYWtlIGl0IGVhc2llciB0byBmaW5kIGhlbHAgYW5kIHN1cHBvcnQuIElmIGEgV2ViIHBhZ2UgY29udGFpbnMgaGVscCBtZWNoYW5pc21zIHRoZXkgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgcmVsYXRpdmUgdG8gb3RoZXIgcGFnZSBjb250ZW50LCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCIzLjMuN1wiOiBcIk1ha2UgaXQgZWFzaWVyIGZvciB1c2VycyB0byBjb21wbGV0ZSBtdWx0aS1zdGVwIHByb2Nlc3Nlcy4gRG9uJ3QgYXNrIGZvciB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0d2ljZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlwiLFxuICAgIFwiMy4zLjhcIjogXCJNYWtlIGxvZ2lucyBwb3NzaWJsZSB3aXRoIGxlc3MgbWVudGFsIGVmZm9ydC4gRG9uJ3QgbWFrZSBwZW9wbGUgc29sdmUsIHJlY2FsbCwgb3IgdHJhbnNjcmliZSBzb21ldGhpbmcgdG8gbG9nIGluLlwiLFxuICAgIFwiNC4xLjFcIjogXCIoT2Jzb2xldGUgYW5kIHJlbW92ZWQpIFRoaXMgcmVxdWlyZW1lbnQgd2FzIG9yaWdpbmFsbHkgYWRvcHRlZCB0byBhZGRyZXNzIHByb2JsZW1zIHRoYXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgKEFUKSBoYWQgZGlyZWN0bHkgcGFyc2luZyBIVE1MLiBBVCBubyBsb25nZXIgaGFzIGFueSBuZWVkIHRvIGRpcmVjdGx5IHBhcnNlIEhUTUwuIENvbnNlcXVlbnRseSwgdGhlc2UgcHJvYmxlbXMgZWl0aGVyIG5vIGxvbmdlciBleGlzdCBvciBhcmUgYWRkcmVzc2VkIGJ5IG90aGVyIHJlcXVpcmVtZW50cy5cIiwgXG4gICAgXCI0LjEuMlwiOiBcIkZvciBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGZvcm0gZWxlbWVudHMsIGxpbmtzIGFuZCBjb21wb25lbnRzIGdlbmVyYXRlZCBieSBzY3JpcHRzKSwgdGhlIG5hbWUgYW5kIHJvbGUgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZDsgc3RhdGVzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBzZXQ7IGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byB0aGVzZSBpdGVtcyBpcyBhdmFpbGFibGUgdG8gdXNlciBhZ2VudHMsIGluY2x1ZGluZyBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLlwiLFxuICAgIFwiNC4xLjNcIjogXCJJbiBjb250ZW50IGltcGxlbWVudGVkIHVzaW5nIG1hcmt1cCBsYW5ndWFnZXMsIHN0YXR1cyBtZXNzYWdlcyBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHRocm91Z2ggcm9sZSBvciBwcm9wZXJ0aWVzIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYnkgYXNzaXN0aXZlIHRlY2hub2xvZ2llcyB3aXRob3V0IHJlY2VpdmluZyBmb2N1cy5cIixcbiAgICBcIkhUTUxcIjogXCJUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGlzc3VlcyB0aGF0IGNhdXNlIGFjY2Vzc2liaWxpdHkgaXNzdWVzIG1heSBiZSBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHVuZGVyIHRob3NlIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnRzLiBIb3dldmVyLCBzb21lIG5vbi1jb25mb3JtaW5nIEhUTUwgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgYXJlIHN0aWxsIHJlcG9ydGVkLlwiLFxuICAgIFwiQVJJQVwiOiBcIlRoZSBBUklBIHNwZWNpZmljYXRpb24gaXNzdWVzIHRoYXQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgbWF5IGJlIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgdW5kZXIgdGhvc2UgYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudHMuIEhvd2V2ZXIsIHNvbWUgbm9uLWNvbmZvcm1pbmcgQVJJQSBzcGVjaWZpY2F0aW9uIGlzc3VlcyBhcmUgc3RpbGwgcmVwb3J0ZWQuXCIsXG59ICAgICBcblxuZXhwb3J0IGNvbnN0IGExMXlSdWxlc2V0czogR3VpZGVsaW5lW10gPSBbXG4gICAgLy8ge1xuICAgIC8vICAgICBpZDogXCJERUJVR1wiLFxuICAgIC8vICAgICBuYW1lOiBcIkRFQlVHIFJ1bGVzXCIsXG4gICAgLy8gICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgLy8gICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBkZWJ1Z2dpbmdcIixcbiAgICAvLyAgICAgY2hlY2twb2ludHM6IFt7XG4gICAgLy8gICAgICAgICBudW06IFwiMVwiLFxuICAgIC8vICAgICAgICAgbmFtZTogXCJEZWJ1ZyBDUCAxXCIsXG4gICAgLy8gICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgIC8vICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRGVidWdcIlxuICAgIC8vICAgICB9XVxuICAgIC8vIH0sXG4gICAge1xuICAgICAgICBpZDogXCJFWFRFTlNJT05TXCIsXG4gICAgICAgIG5hbWU6IFwiRXh0ZW5zaW9uIFJ1bGVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIGVuYWJsaW5nIHRoZSBicm93c2VyIGV4dGVuc2lvbnNcIixcbiAgICAgICAgdHlwZTogZUd1aWRlbGluZVR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSA3LjNcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjAsIDIuMSwgMi4yIEEgYW5kIEFBIHBsdXMgYWRkaXRpb25hbCBJQk0gc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIiB8fCBzYy5sZXZlbCA9PT0gXCJOQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiTkFcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSBuZXh0XCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wLCAyLjEsIDIuMiBBIGFuZCBBQSBwbHVzIGFkZGl0aW9uYWwgSUJNIHN1cHBsZW1lbnRhbCByZXF1aXJlbWVudHMuXCIsXG4gICAgICAgIC8vIFRoaXMgcnVsZXNldCBoYXMgYWxsIDIuMCBhbmQgMi4xIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIgfHwgc2MubGV2ZWwgPT09IFwiTkFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMlwiIHx8IHNjLndjYWdUeXBlID09PSBcIk5BXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMlwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4yIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjIgQSAmIEFBLiBUaGlzIGlzIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbiAoc3BlY2lmaWNhdGlvbikuIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMiBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4xLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMVwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4xIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQSAmIEFBLiBDb250ZW50IHRoYXQgY29uZm9ybXMgdG8gV0NBRyAyLjEgYWxzbyBjb25mb3JtcyB0byBXQ0FHIDIuMC5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzBcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMCAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEEgJiBBQS4gUmVmZXJlbmNlZCBieSBVUyBTZWN0aW9uIDUwOCwgYnV0IG5vdCB0aGUgbGF0ZXN0IFczQyByZWNvbW1lbmRhdGlvbi5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIpICYmIChzYy53Y2FnVHlwZSA9PT0gXCIyLjBcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfVxuXVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgY2xhc3MgQWNjTmFtZVV0aWwge1xuICAgIFxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIGEgZ2l2ZW4gbm9kZVxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lKGVsZW06IEVsZW1lbnQpIDogYW55IHwgbnVsbCB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCBuYW1lX3BhaXIgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG5hbWVfcGFpcjtcblxuICAgICAgICAvLyAxLiBuYW1lIGZyb20gYXV0aG9yLCBvciBlbGVtZW50cyB3aXRob3V0IGEgcm9sZSBidXQgd2l0aCBhcmlhLWxhYmVsbGVkYnkgb3IgYXJpYS1sYWJlbCBcbiAgICAgICAgLy8gICBnZXQgYXJpYSBsYWJlbCBldmVuIGZvciB0aGUgcm9sZSB3aGVyZSB0aGUgbmFtZSBpcyBwcm9oaWJpdGVkIG9yIGlzICdwcmVzZW50YXRpb24nIG9yICdub25lJ1xuICAgICAgICBsZXQgYWNjTmFtZSA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChlbGVtKTtcbiAgICAgICAgaWYgKGFjY05hbWUgJiYgYWNjTmFtZS50cmltKCkgIT09IFwiXCIpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGFjY05hbWUpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYUxhYmVsXCJ9KTtcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWNjTmFtZSksIFwibmFtZUZyb21cIjogXCJhcmlhTGFiZWxcIn07XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBhY2Nlc3NpYmxlIG5hbWUgbWFwcGluZyBmb3IgbmF0aXZlIGh0bWwgZWxlbWVudHNcbiAgICAgICAgbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yTmF0aXZlRWxlbWVudChlbGVtKTtcbiAgICAgICAgaWYgKG5hbWVfcGFpcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBuYW1lX3BhaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gMy4gbmFtZSBmcm9tIG5hdGl2ZSBvciBhcmlhIGF0dHJpYnV0ZVxuICAgICAgICAvKipuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQXR0cmlidXRlKGVsZW0pO1xuICAgICAgICBpZiAobmFtZV9wYWlyKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIG5hbWVfcGFpcik7XG4gICAgICAgICAgICByZXR1cm4gbmFtZV9wYWlyO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvLyA0LiBuYW1lIGZyb20gY29udGVudCBmb3IgY3VzdG9tIGVsZW1lbnRzIHdpdGggYSByb2xlXG4gICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIikpIHtcbiAgICAgICAgICAgIG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZyb21Db250ZW50KGVsZW0pO1xuICAgICAgICAgICAgaWYgKG5hbWVfcGFpcikge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwgbmFtZV9wYWlyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZV9wYWlyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNS4gbmFtZSBmcm9tIHRoZSBnbG9iYWwgYXR0cmlidXRlIFwidGl0bGVcIlxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgbGV0IHRpdGxlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aXRsZSA9IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRpdGxlKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjp0aXRsZSwgXCJuYW1lRnJvbVwiOiBcInRpdGxlXCJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnRpdGxlLCBcIm5hbWVGcm9tXCI6IFwidGl0bGVcIn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIDYuIG5hbWUgZnJvbSB0aGUgYXR0cmlidXRlIFwicGxhY2Vob2xkZXJcIlxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmICghZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IENvbW1vblV0aWwuaW5wdXRfdHlwZV93aXRoX3BsYWNlaG9sZGVyLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkpKSkge1xuICAgICAgICAgICAgbGV0IHBsYWNlaG9sZGVyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKTtcbiAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlciAmJiBwbGFjZWhvbGRlci50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQocGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwge1wibmFtZVwiOnBsYWNlaG9sZGVyLCBcIm5hbWVGcm9tXCI6IFwicGxhY2Vob2xkZXJcIn0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6cGxhY2Vob2xkZXIsIFwibmFtZUZyb21cIjogXCJwbGFjZWhvbGRlclwifTtcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cblxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIG51bGwpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBuYXRpdmUgZWxlbWVudHNcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvck5hdGl2ZUVsZW1lbnQoZWxlbTogRWxlbWVudCkgOiBhbnkgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBsYWJlbGxhYmxlIGZpZWxkc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldEZvcm1GaWVsZExhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlucHV0IHR5cGVzOiBidXR0b24sIHJlc2V0LCBzdWJtaXQsIGltYWdlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSkgeyBcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB0eXBlczogYnV0dG9uLCByZXNldCwgc3VibWl0XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGZvciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodmFsdWUpLCBcIm5hbWVGcm9tXCI6IFwidmFsdWVcIn07XG5cbiAgICAgICAgICAgICAgICAvLyBpbnB1dCAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6dHlwZSwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHR5cGUgPSAnaW1hZ2UnXG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRob3VnaCBIVE1MIDUgc3BlYyBpbmRpY2F0ZXMgXCJUaGUgZWxlbWVudCdzIFt2YWx1ZV0gYXR0cmlidXRlIG11c3QgYmUgb21pdHRlZFwiLCBDaHJvbWUgdXNlcyB0aGUgdmFsdWUuXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZSBhbHQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgY29uc3QgYWx0ID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQgJiYgYWx0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTs7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGUgdmlzaWJsZSBkZWZhdWx0IHRleHQgZm9yIHR5cGUgXCJpbWFnZVwiIGlzIFwiU3VibWl0XCIgc2FtZSB3aXRoIHRoZSB0eXBlIFwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAvL3JldHVybiB7XCJuYW1lXCI6ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLCBcIm5hbWVGcm9tXCI6IFwiaW50ZXJuYWxcIn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBidXR0b25cbiAgICAgICAgLy8gbm90ZSBidXR0b24gbWF5IGhhdmUgYSB2YWx1ZSBhdHRyaWJ1dGUsIGJ1dCBpdCdzIG5vdCBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHVzZSB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJ0ZXh0XCJ9O1xuXG4gICAgICAgICAgICAvLyBmb3IgaW1hZ2UgYnV0dG9uOiBnZXQgdGhlIGZpcnN0IGltYWdlIGlmIGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaWYgKGltYWdlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChpbWFnZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpOyBcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmllbGRzZXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImZpZWxkc2V0XCIpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBmaWVsZHNldCBlbGVtZW50J3MgZmlyc3QgY2hpbGQgaXMgYSBsZWdlbmQgZWxlbWVudCwgdGhlbiB1c2UgdGhlIHN1YnRyZWUgb2YgdGhlIGxlZ2VuZFxuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGZpcnN0ICYmIGZpcnN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdsZWdlbmQnKSB7XG4gICAgICAgICAgICAgICAgLy8gbGVnZW5kIGNhbiBiZSBtaXhlZCB0ZXh0XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChmaXJzdCBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0ICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwibGVnZW5kXCJ9OyBcbiAgICAgICAgICAgIH0gICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3V0cHV0XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJvdXRwdXRcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGFzc29jaWF0ZWQgbGFiZWwgZWxlbWVudCBleGlzdHMsIHVzZSBjb25jYXRlbmF0ZWQgYWNjZXNzaWJsZSBuYW1lKHMpIGZyb20gbGFiZWxsZWQgZWxlbWVudHMuXG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJmb3JcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRHMgPSBlbGVtLmdldEF0dHJpYnV0ZShcImZvclwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbElEcyAmJiBsYWJlbElEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGFiZWxJRHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbE5vZGUgPSBlbGVtLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobGFiZWxJRHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZW0pICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChsYWJlbE5vZGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGxhYmVsTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGxhYmVsTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsICs9IFwiIFwiICsgQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHBhaXIubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3VtbWFyeVxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3VtbWFyeVwiKSB7XG4gICAgICAgICAgICAvLyB1c2Ugc3VtbWFyeSBlbGVtZW50IHN1YnRyZWVcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcImxlZ2VuZFwifTsgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRldGFpbHNcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImRldGFpbHNcIikge1xuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGZpcnN0ICYmIGZpcnN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5Jykge1xuICAgICAgICAgICAgICAgIC8vIGdldCBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBzdW1tYXJ5XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShmaXJzdCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQocGFpci5uYW1lLnRyaW0oKSksIFwibmFtZUZyb21cIjogXCJzdW1tYXJ5XCJ9OyBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIG5vIHN1bW1hcnkgZWxlbWVudCBhcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgZGV0YWlscyBlbGVtZW50LCBcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGFnZW50IHNob3VsZCBwcm92aWRlIG9uZSB3aXRoIGEgc3VidHJlZSBjb250YWluaW5nIGEgbG9jYWxpemVkIHN0cmluZyBvZiB0aGUgd29yZCBcImRldGFpbHNcIi5cbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6XCJkZXRhaWxzXCIsIFwibmFtZUZyb21cIjogXCJpbnRlcm5hbFwifTsgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpZ3VyZVxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZmlndXJlXCIpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBmaWd1cmUgZWxlbWVudCBoYXMgYSBmaWdjYXB0aW9uIGFzIHRoZSBmaXJzdCBvciBsYXN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgY2FwdGlvbiA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoIWNhcHRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXB0aW9uID0gZWxlbS5sYXN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgICAgIGlmIChjYXB0aW9uICYmIGNhcHRpb24ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpZ2NhcHRpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpZ2NhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjYXB0aW9uIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcImZpZ2NhcHRpb25cIn07IFxuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICB9ICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGltZyBlbGVtZW50czogdXNlIGF0dHJpYnV0ZSBcImFsdFwiXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbWdcIikge1xuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYWx0XCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFsdCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFyZWEgZWxlbWVudHM6IHVzZSBhdHRyaWJ1dGUgXCJhbHRcIlxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYXJlYVwiKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGFsdCAmJiBhbHQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRhYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInRhYmxlXCIpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBmaWd1cmUgZWxlbWVudCBoYXMgYSBjYXB0aW9uIGFzIHRoZSBmaXJzdCBjaGlsZFxuICAgICAgICAgICAgbGV0IGNhcHRpb25FbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uRWxlbSAmJiBjYXB0aW9uRWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnY2FwdGlvbicpIHtcbiAgICAgICAgICAgICAgICAvLyBjYXB0aW9uIGNhbiBiZSBtaXhlZCB0ZXh0XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwdGlvbiA9IChjYXB0aW9uRWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIGlmIChjYXB0aW9uICYmIGNhcHRpb24udHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGNhcHRpb24pLCBcIm5hbWVGcm9tXCI6IFwiY2FwdGlvblwifTsgXG4gICAgICAgICAgICB9ICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBhIGVsZW1lbnRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImFcIikge1xuICAgICAgICAgICAgLy8gZmlyc3QgdXNlIHRoZSBsaW5rIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJ0ZXh0XCJ9O1xuICAgICAgICAgICAgIFxuICAgICAgICAgICAgLy9mb3IgaW1hZ2UgbGluazogZ2V0IHRoZSBpbWFnZSBvciBzdmcgaWYgZXhpc3RzXG4gICAgICAgICAgICBjb25zdCBpbWFnZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBpbWcsIDpzY29wZSA+IHN2Z1wiKTtcbiAgICAgICAgICAgIGlmIChpbWFnZXMgJiYgaW1hZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaW1hZ2VzLmZvckVhY2goaW1hZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGltYWdlKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChpbWFnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyBwYWlyLm5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9wdGdyb3VwXG4gICAgICAgIC8vIGxhYmVsIHBhcnRpY2lwYXRlIGluIGFjY2Vzc2libGUgbmFtZSBjYWxjdWxhdGlvbjogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYWFtLTEuMC8jYXR0LWxhYmVsXG4gICAgICAgIC8vIFRoZSBsYWJlbCBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQuIEl0cyB2YWx1ZSBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgZ3JvdXBcbiAgICAgICAgLy8gdGhlIHZhbHVlIGlzIGRpc2FibGVkIGluIHRoZSBpbnRlcmZhY2VcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcIm9wdGdyb3VwXCIgfHwgbm9kZU5hbWUgPT09IFwib3B0aW9uXCIgfHwgbm9kZU5hbWUgPT09IFwidHJhY2tcIikge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBlbGVtLmdldEF0dHJpYnV0ZShcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQobGFiZWwpLCBcIm5hbWVGcm9tXCI6IFwibGFiZWxcIn07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdmdcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU1ZHRWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgIHJldHVybiBwYWlyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIG5hdGl2ZSBlbGVtZW50c1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU1ZHRWxlbWVudChlbGVtOiBFbGVtZW50KSA6IGFueSB8IG51bGwge1xuICAgICAgICAvLyAxLiBhIGRpcmVjdCBjaGlsZCBvciBkZXNjZW5kYW50IHRpdGxlIGVsZW1lbnQgXG4gICAgICAgIGNvbnN0IHN2Z1RpdGxlcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgICAgICBpZiAoc3ZnVGl0bGVzICYmIHN2Z1RpdGxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgICAgICBzdmdUaXRsZXMuZm9yRWFjaChzdmdUaXRsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN2Z1RpdGxlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChzdmdUaXRsZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoc3ZnVGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gc3ZnVGl0bGUudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZSAmJiB0aXRsZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSB0aXRsZS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnRleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwic3ZnVGl0bGVcIn07XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiB4bGluazp0aXRsZSBhdHRyaWJ1dGUgb24gYSBsaW5rXG4gICAgICAgIGxldCBsaW5rVGl0bGUgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgICAgICBpZiAobGlua1RpdGxlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChsaW5rVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGxpbmtUaXRsZSkpIHtcbiAgICAgICAgICAgIGxldCBsaW5rID0gbGlua1RpdGxlLmdldEF0dHJpYnV0ZShcInhsaW5rOnRpdGxlXCIpO1xuICAgICAgICAgICAgaWYgKGxpbmsgJiYgbGluay50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQobGluayksIFwibmFtZUZyb21cIjogXCJzdmdsaW5rVGl0bGVcIn07XG4gICAgICAgIH1cblxuICAgICAgICAvKiogMy4gZm9yIHRleHQgY29udGFpbmVyIGVsZW1lbnRzLCB0aGUgdGV4dCBjb250ZW50LiBcbiAgICAgICAgICogbm90ZSB0aGUgU1ZHIHRleHQgY29udGVudCBlbGVtZW50cyBhcmU6IOKAmHRleHTigJksIOKAmHRleHRQYXRo4oCZIGFuZCDigJh0c3BhbuKAmS5cbiAgICAgICAgICogIHN2ZyBlbGVtZW50IGNhbiBiZSBuZXN0ZWQuIE9uZSBvZiB0aGUgcHVycG9zZXMgaXMgdG8gdG8gZ3JvdXAgU1ZHIHNoYXBlcyB0b2dldGhlciBhcyBhIGNvbGxlY3Rpb24gZm9yIHJlc3BvbnNpdmUgZGVzaWduLlxuICAgICAgICAgKiBcbiAgICAgICAgICogc2VsZWN0IHRleHQgY29udGVudCBleGNsdWRlZCB0aGUgdGV4dCBmcm9tIHRoZSBuZXN0ZWQgc3ZnIGVsZW1lbnRzIGFuZCB0aGVpciBjaGlsZHJlbiBcbiAgICAgICAgICovIFxuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+ICpcIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3N2ZycgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RleHRcIn07IFxuXG4gICAgICAgIC8vIDQuIGZyb20gYXJpYS1kZXNjcmliZWRieSBvciBhcmlhLWRlc2NyaXB0aW9uIFxuICAgICAgICBsZXQgZGVzY2J5ID0gQXJpYVV0aWwuZ2V0QXJpYURlc2NyaXB0aW9uKGVsZW0pO1xuICAgICAgICBpZiAoZGVzY2J5ICYmIGRlc2NieS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoZGVzY2J5KSwgXCJuYW1lRnJvbVwiOiBcImFyaWEtZGVzY3JpcHRpb25cIn07XG5cbiAgICAgICAgLy8gNS4gYSBkaXJlY3QgY2hpbGQgb3IgZGVzY2VuZGFudCBkZXNjIGVsZW1lbnRcbiAgICAgICAgbGV0IGRlc2NFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IGRlc2NcIik7XG4gICAgICAgIGlmIChkZXNjRWxlbXMgJiYgZGVzY0VsZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIGRlc2NFbGVtcy5mb3JFYWNoKGRlc2NFbGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVzY0VsZW0gJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGRlc2NFbGVtKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChkZXNjRWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzYyA9IGRlc2NFbGVtLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IGRlc2MudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6dGV4dC50cmltKCksIFwibmFtZUZyb21cIjogXCJzdmdEZXNjXCJ9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgY3VzdG9tIGVsZW1lbnRzIG1hcmtlZCB3aXRoIGFyaWFcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZyb21Db250ZW50KGVsZW06IEVsZW1lbnQpIDogYW55IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBcbiAgICAgICAgLyoqIGZvciBhY2MgbmFtZSBmcm9tIGNvbnRlbnQsIHRoZSBjb250ZW50IGZyb20gQ1NTIHBzZXVkby1lbGVtZW50cyBcbiAgICAgICAgICogIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICogRm9yIDpiZWZvcmUgb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgdXNlciBhZ2VudHMgbXVzdCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBzcGFjZSwgXG4gICAgICAgICAqICAgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JDU1NQc2V1ZG9FbGVtZW50KGVsZW0sIFwiYmVmb3JlXCIpO1xuICAgICAgICBpZiAocGFpciAhPT0gbnVsbCAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG5cbiAgICAgICAgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbSwgXCJhZnRlclwiKTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuXG4gICAgICAgIC8vICBzaGFkb3cgaG9zdFxuICAgICAgICBpZiAoZWxlbS5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU2hhZG93SG9zdChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2hhZG93XCJ9OztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2xvdCBlbGVtZW50XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTbG9zdEVsZW1lbnQoZWxlbSk7XG4gICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IHBhaXIubmFtZSwgXCJuYW1lRnJvbVwiOiBcInNsb3RcIn07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdGhlcndpc2U6IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgZWxlbWVudFxuICAgICAgICBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUNoaWxkcmVuKGVsZW0pO1xuICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudFwifTtcblxuICAgICAgICAvLyBubyBhY2Nlc3NpYmxlIG5hbWUgZXhpc3RzXG4gICAgICAgIHJldHVybiBudWxsOyAgICBcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZyb20gQ1NTIGdlbmVyYXRlZCBjb250ZW50XG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JDU1NQc2V1ZG9FbGVtZW50KGVsZW06IEVsZW1lbnQsIHR5cGU6c3RyaW5nKSA6IGFueSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb250ZW50RWxlbSA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sdHlwZSk7XG4gICAgICAgIGlmIChjb250ZW50RWxlbSkge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBjb250ZW50RWxlbS5jb250ZW50O1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudCAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9eXCIvLFwiXCIpLnJlcGxhY2UoL1wiJC8sXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGNvbnRlbnQpLCBcIm5hbWVGcm9tXCI6IFwiY3NzLVwiK3R5cGV9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIFNMT1QgZWxlbWVudFxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU2hhZG93SG9zdChlbGVtOiBFbGVtZW50KSA6IGFueSB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBlbGVtLnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTsgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgdGhlIGNoaWxkcmVuIGVsZW1lbnRzXG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJzaGFkb3ctaG9zdFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNsb3N0RWxlbWVudChlbGVtOiBFbGVtZW50KSA6IGFueSB8IG51bGwge1xuICAgICAgICAvL2lmIG5vIGFzc2lnbmVkTm9kZSwgY2hlY2sgaXRzIG93biB0ZXh0IFxuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGlmICghKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkgfHwgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgfSBlbHNlIHsgICAgXG4gICAgICAgICAgICAvLyBjaGVjayB0ZXh0IGZyb20gYWxsIGFzc2lnbmVkIG5vZGVzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNsb3RDaGlsZCBvZiAoZWxlbSBhcyBIVE1MU2xvdEVsZW1lbnQpLmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHNsb3RDaGlsZCBhcyBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyBwYWlyLm5hbWUudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJjb250ZW50LXNsb3RcIn07XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmcm9tIGNoaWxkcmVuIGNvbnRlbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZyb21DaGlsZHJlbihlbGVtOiBFbGVtZW50KSA6IGFueSB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIC8vbGV0IHdhbGtDaGlsZCA9IGVsZW0uZmlyc3RDaGlsZDtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtKTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHRvIGdldCB0aGUgdGV4dFxuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9PSBlbGVtICYmIG53Lm5vZGUgIT09IGVsZW0ucGFyZW50Tm9kZSkge1xuICAgICAgICAvL3doaWxlICh3YWxrQ2hpbGQpIHsgXG4gICAgICAgICAgICBjb25zdCB3YWxrQ2hpbGQgPSBudy5ub2RlOyBcbiAgICAgICAgICAgIGlmICh3YWxrQ2hpbGQubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHRleHQgbm9kZSwgZ2V0IHRoZSBwYXJlbnRub2RlIHRvIGNoZWNrIHZpc2liaWxpdHlcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB3YWxrQ2hpbGQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHBhcmVudCkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwocGFyZW50KSAmJiB3YWxrQ2hpbGQubm9kZVZhbHVlICYmIHdhbGtDaGlsZC5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2Fsa0NoaWxkLm5vZGVUeXBlID09PSAxICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVCh3YWxrQ2hpbGQgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHdhbGtDaGlsZCBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHdhbGtDaGlsZCBhcyBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IFxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucywgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4vQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY2xhc3MgQXJpYVV0aWwge1xuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBlbGVtZW50cyB0YWdzIHdoaWNoIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBzaW5jZSB3ZSBoYXZlIHJ1bGVzIHRyaWdnZXJpbmdcbiAgICBwdWJsaWMgc3RhdGljIG5hdkxpbmtLZXl3b3JkcyA9IFsnc3RhcnQnLCAnbmV4dCcsICdwcmV2JywgJ3ByZXZpb3VzJywgJ2NvbnRlbnRzJywgJ2luZGV4J11cblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgcnVsZSBpZHMgZm9yIHRoZSBydWxlcyB0aGF0IGhhdmUgdG8gY2hlY2sgZm9yIGhpZGRlbiBjb250ZW50IHJlZ2FyZGxlc3Mgb2YgdGhlIENoZWNrIEhpZGRlblxuICAgIC8vIENvbnRlbnQgU2V0dGluZy4gVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlIGVuZ2luZSBpcyBhY3R1YWxseSBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgdG8gbWFzcyB0byB0aGUgcnVsZXMsIGl0IHdpbGwgYWx3YXlzXG4gICAgLy8gcGFzcyB0aGVzZXMgcnVsZXMgbm8gbWF0dGVyIHdoYXQgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaXMuXG4gICAgcHVibGljIHN0YXRpYyBydWxlc1RoYXRIYXZlVG9DaGVja0hpZGRlbiA9IFsnUlBUX0VsZW1fVW5pcXVlSWQnXVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlQXRJbmRleChlbGUsIGluZGV4KSB7XG4gICAgICAgIGxldCBhdHRyTmFtZSA9IGVsZS5hdHRyaWJ1dGVzW2luZGV4XS5uYW1lO1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShlbGUsIGF0dHJOYW1lKTtcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4xLyNpbnRyb3N0YXRlc1xuICAgIHB1YmxpYyBzdGF0aWMgYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0cyA9IHtcbiAgICAgICAgXCJhbGVydFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtbGl2ZVwiOiBcImFzc2VydGl2ZVwiLFxuICAgICAgICAgICAgXCJhcmlhLWF0b21pY1wiOiBcInRydWVcIlxuICAgICAgICB9LFxuICAgICAgICBcImNvbWJvYm94XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiBcImxpc3Rib3hcIlxuICAgICAgICB9LFxuICAgICAgICBcImxpc3Rib3hcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImxvZ1wiOiB7XG4gICAgICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibWVudVwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibWVudWJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZXRlclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICBcImFyaWEtc2VsZWN0ZWRcIjogXCJmYWxzZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwicHJvZ3Jlc3NiYXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzY3JvbGxiYXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwidmVydGljYWxcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VwYXJhdG9yXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic2xpZGVyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwic3BpbmJ1dHRvblwiOiB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VyZSBob3cgdG8gZW5jb2RlIG1pbi9tYXggKG9yIG5vdyBpbiAxLjIgLSBcImhhcyBubyB2YWx1ZVwiKVxuICAgICAgICAgICAgLy9cImFyaWEtdmFsdWVub3dcIjogXCIwXCIgVE9ETzogYXQgcmlzazogbWF5YmUgZGVsZXRlIGFmdGVyIEFSSUEgMS4yIHJlYWNoZXMgcHJvcG9zZWQgcmVjXG4gICAgICAgICAgICAvLyBQcm9iYWJseSBqdXN0IGRlbGV0ZSBzcGluYnV0dG9uIGZyb20gdGhpcyBsaXN0IGNvbXBsZXRlbHkgYW5kIGxldCB1c2VyIGFnZW50cyBoYW5kbGUgXCJkZWZhdWx0c1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwic3RhdHVzXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCIsXG4gICAgICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidGFiXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBcImZhbHNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJsaXN0XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcInRvb2xiYXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidHJlZVwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4xLyNhcmlhLWF0b21pY1xuICAgIHB1YmxpYyBzdGF0aWMgYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzID0ge1xuICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiBcIm5vbmVcIixcbiAgICAgICAgXCJhcmlhLWJ1c3lcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLWRyb3BlZmZlY3RcIjogXCJub25lXCIsXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1ncmFiYmVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1pbnZhbGlkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJvZmZcIixcbiAgICAgICAgXCJhcmlhLW1vZGFsXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW11bHRpbGluZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtcHJlc3NlZFwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiBcImZhbHNlXCIsXG4gICAgICAgIC8vXCJhcmlhLXJlbGV2YW50XCI6IFwiYWRkaXRpb25zIHRleHRcIiwgVE9ETzogYXJlIG11bHRpcGxlIHZhbHVlcyBzdXBwb3J0ZWQ/XG4gICAgICAgIFwiYXJpYS1yZXF1aXJlZFwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1zb3J0XCI6IFwibm9uZVwiXG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYWFtLTEuMC8jaHRtbC1hdHRyaWJ1dGUtc3RhdGUtYW5kLXByb3BlcnR5LW1hcHBpbmdzXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncyA9IHtcbiAgICAgICAgXCJhcmlhLWF1dG9jb21wbGV0ZVwiOiB7XG4gICAgICAgICAgICBcImZvcm1cIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2ZmXCIgPT09IGUuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpID8gXCJub25lXCIgOiBcImJvdGhcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHRhcmVhXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2ZmXCIgPT09IGUuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpID8gXCJub25lXCIgOiBcImJvdGhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcImluZGV0ZXJtaW5hdGVcIikpIHJldHVybiBcIm1peGVkXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBlLmhhc0F0dHJpYnV0ZShcImNoZWNrZWRcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtZW51aXRlbVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmhhc0F0dHJpYnV0ZShcImluZGV0ZXJtaW5hdGVcIikpIHJldHVybiBcIm1peGVkXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBlLmhhc0F0dHJpYnV0ZShcImNoZWNrZWRcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCIqXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiB7XG4gICAgICAgICAgICBcImJ1dHRvblwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZpZWxkc2V0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvcHRncm91cFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGlvblwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHRhcmVhXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjoge1xuICAgICAgICAgICAgXCJkZXRhaWxzXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwib3BlblwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGlhbG9nXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwib3BlblwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IHtcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwibXVsdGlwbGVcIikpIHJldHVybiBcInRydWVcIjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHRhcmVhXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHRhcmVhXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGFyaWEgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGFyaWEgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmIChpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmlhQXR0cmlidXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHVzZXItZGVmaW5lZCBodG1sIGF0dHJpYnV0ZSBuYW1lIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBodG1sIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkSHRtbEF0dHJpYnV0ZXMoZWxlbSkge1xuICAgICAgICBsZXQgaHRtbEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoIWlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGFyaWEgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBhcmlhQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaCh7IG5hbWU6IGF0dHJOYW1lLCB2YWx1ZTogYXR0clZhbHVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmlhQXR0cmlidXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHVzZXItZGVmaW5lZCBodG1sIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIHBhaXIgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSkge1xuICAgICAgICBsZXQgaHRtbEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlID09PSAnJykgYXR0clZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlcy5wdXNoKHsgbmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0bWxBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgaW1wbGljaXQgYXJpYSBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUsIGFuIGlucHV0IHdpdGggY2hlY2tlZCBpcyBlcXVpdmFsZW50IHRvIGFyaWEtY2hlY2tlZD1cInRydWVcIlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYUF0dHJpYnV0ZShlbGUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBpdCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgIGxldCByZXRWYWwgPSBlbGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICYmIHJldFZhbC50cmltKCkgPT09IFwiXCIpIHsgLy9cIlwiIGlzIHRyZWF0ZWQgYXMgZmFsc2UsIHNvIHdlIG5lZWQgcmV0dXJuIGl0IGJlZm9yZSB0aGUgYmVsb3cgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlbiBkZXRlcm1pbmUgaW1wbGljaXQgdmFsdWVzIGZyb20gb3RoZXIgYXR0cmlidXRlc1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHRhZyA9IGVsZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdW3RhZ107XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHJldFZhbCkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFwiKlwiIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdW1wiKlwiXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHJvbGUtYmFzZWQgZGVmYXVsdHNcbiAgICAgICAgaWYgKCFyZXRWYWwpIHtcbiAgICAgICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAocm9sZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzICYmIGF0dHJpYnV0ZU5hbWUgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHNbcm9sZV1bYXR0cmlidXRlTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0aWxsIG5vdCBkZWZpbmVkPyBDaGVjayBnbG9iYWwgZGVmYXVsdHNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0c1thdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShlbGUsIGF0dHJOYW1lKSB7XG4gICAgICAgIGxldCBpc0RlZmluZWRBcmlhQXR0cmlidXRlID0gZmFsc2U7XG4gICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIHtcbiAgICAgICAgICAgIC8vIFVzZXIgYWdlbnRzIFNIT1VMRCB0cmVhdCBzdGF0ZSBhbmQgcHJvcGVydHkgYXR0cmlidXRlcyB3aXRoIGEgdmFsdWUgb2YgXCJcIiB0aGUgc2FtZSBhcyB0aGV5IHRyZWF0IGFuIGFic2VudCBhdHRyaWJ1dGUuXG4gICAgICAgICAgICBpc0RlZmluZWRBcmlhQXR0cmlidXRlID0gZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKGF0dHJOYW1lKSAmJiBlbGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0RlZmluZWRBcmlhQXR0cmlidXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdBSS1BUklB4oCZcyByb2xlIGF0dHJpYnV0ZSBtYXkgaGF2ZSBhIGxpc3Qgb2YgdmFsdWVzLCBidXQgb25seSB0aGUgZmlyc3QgdmFsaWQgYW5kIHN1cHBvcnRlZCBXQUktQVJJQSByb2xlIGlzIHVzZWRcbiAgICAgKiBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtaW1wbGVtZW50YXRpb24vI21hcHBpbmdfcm9sZV90YWJsZVxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgdGhlIHJlc29sZWQgcm9sZSBmb3IgYW4gZWxlbWVudC5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gc3RyaW5nIC0gcmVzb2x2ZWQgcm9sZSBmb3IgdGhlIGVsZW1lbnQ6XG4gICAgICogICAgICAgZXhwbGljaXQgcm9sZTogcmVzb2xlZCBmcm9tIHRoZSBsaXN0IG9mIHZhbHVlc1xuICAgICAqICAgICAgIGltcGxpY2l0IHJvbGU6IGlmIG5vdCBleHBsaWNpdGVseSBzcGVjaWZpZWQsIG9yIG5vbmUgb2YgdGhlIHNwZWNpZmllZCByb2xlIHZhbHVlcyBpcyBhbGxvd2VkIGZvciB0aGUgZWxlbWVudFxuICAgICAqICAgICAgIG51bGw6IGlmIG5vbmUgb2YgdGhlIHNwZWNpZmllZCByb2xlIHZhbHVlcyBpcyBhbGxvd2VkIGZvciB0aGUgZWxlbWVudCwgbmVpdGhlciBpbXBsaWNpdCByb2xlIGV4aXN0c1xuICAgICAqICAgICAgIFxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVzb2x2ZWRSb2xlKGVsZW06IEVsZW1lbnQsIGNvbnNpZGVySW1wbGljaXRSb2xlczogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcm9sZSA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlJQVFVUSUxfRUxFTUVOVF9SRVNPTFZFRF9ST0xFXCIsIG51bGwpO1xuICAgICAgICBpZiAocm9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKGVsZW0pOyBcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkoZWxlbSk7XG4gICAgICAgICAgICBsZXQgYWxsb3dlZFJvbGVzID0gQXJpYVV0aWwuZ2V0QWxsb3dlZEFyaWFSb2xlcyhlbGVtLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgICAgICBsZXQgY29udGFpbnNHZW5lcmljID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCAmJiBhbGxvd2VkUm9sZXMgJiYgYWxsb3dlZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkUm9sZXMuaW5jbHVkZXMoXCJhbnlcIikgfHwgYWxsb3dlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcyhcImFueVwiKSAmJiByb2xlc1tpXSA9PT0gJ2dlbmVyaWMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNHZW5lcmljID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBlbGVtZW50IGlzIGZvY3VzYWJsZSwgdGhlbiBwcmVzZW50YXRpb24gcm9sZXMgYXJlIHRvIGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc2V0IHJ1bGUgdG8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zR2VuZXJpYykgcm9sZSA9ICdnZW5lcmljJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IG51bGwgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIHJvbGUgPSBpbXBsaWNpdFJvbGUgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDAgPyBpbXBsaWNpdFJvbGVbMF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJSUFRVVElMX0VMRU1FTlRfUkVTT0xWRURfUk9MRVwiLCByb2xlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZSAhPT0gdW5kZWZpbmVkID8gcm9sZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB1c2VyIGRlZmluZWQgZWxlbWVudCdzIHJvbGVzIGZyb20gZG9tLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcm9sZXMgLSBsaXN0IG9mIHVzZXIgZGVmaW5lZCByb2xlcyBpbiB0aGUgZWxlbWVudCByb2xlIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRSb2xlcyhlbGU6IEVsZW1lbnQpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5nZXRSb2xlcyhlbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIGVsZW1lbnQncyByb2xlcy5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gZmluZHMgaW1wbGljaXQgcm9sZXMuXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJvbGVzIC0gbGlzdCBvZiBhdHRyaWJ1dGUgcm9sZXMgYW5kIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb2xlcyhlbGU6IEVsZW1lbnQsIGNvbnNpZGVySW1wbGljaXRSb2xlczogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGxldCBhdHRyUm9sZXMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goYXR0clJvbGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgZXhpc3QuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlICE9PSBudWxsICYmIGltcGxpY2l0Um9sZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy9hZGQgaW1wbGljaXQgcm9sZXMgdG8gdGhlIGF0dHJpYnV0ZXMgcm9sZXMuXG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGltcGxpY2l0Um9sZSwgcm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb2xlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbXBsaWNpdCByb2xlIG9mIHRoZSBlbGVtZW1lbnRcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhlIGltcGxpY2l0IHJvbGUgb3IgW10gaWYgZG9lc24ndCBleGlzdFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdFJvbGUoZWxlKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAoIWVsZSB8fCBlbGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaW1wbGljaXRSb2xlczogc3RyaW5nW10gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlLCBcIkFyaWFVdGlsX0ltcGxpY2l0Um9sZVwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFpbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KGVsZSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhcImdlbmVyaWNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlICdnZW5lcmljJyByb2xlIGlzIG9ubHkgYWxsb3dlZCBpZiBhIHZhbGlkIGFyaWEgYXR0cmlidXRlIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbUFyaWFBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlcyhlbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlLCBcIkFyaWFVdGlsX0ltcGxpY2l0Um9sZVwiLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGVBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zWydnZW5lcmljJ107XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLnJlcVByb3BzICYmIHBhdHRlcm4ucmVxUHJvcHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwYXR0ZXJuLnJlcVByb3BzLCByb2xlQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5Lmdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoQVJJQURlZmluaXRpb25zLmdsb2JhbFByb3BlcnRpZXMsIHJvbGVBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5kZXByZWNhdGVkUHJvcHMgJiYgcGF0dGVybi5kZXByZWNhdGVkUHJvcHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwucmVkdWNlQXJyYXlJdGVtTGlzdChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcywgcm9sZUF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSAnZ2VuZXJpYycgcm9sZSBpZiByb2xlQXR0cmlidXRlcyBkb2Vzbid0IGNvbnRhaW4gYW55IG9mIGRvbUFyaWFBdHRyaWJ1dGVzIFxuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZUF0dHJpYnV0ZXMubGVuZ3RoID4gMCAmJiAhcm9sZUF0dHJpYnV0ZXMuc29tZShhdHRyID0+IGRvbUFyaWFBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcGxpY2l0ID0gQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KFsnZ2VuZXJpYyddLCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgaW1wbGljaXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltcGxpY2l0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW1wbGljaXRSb2xlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZXF1aXJlZCBwcm9wZXJ0aWVzIG9mIHRoZSByb2xlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIHRoZSByb2xlXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSBwcm9wZXJ0aWVzIC0gbGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlcXVpcmVkIGJ5IHRoZSByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZSwgZWxlKSB7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0pIHtcbiAgICAgICAgICAgIGxldCByZXF1aXJlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucmVxUHJvcHM7XG4gICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIHNlcGFyYXRvclxuICAgICAgICAgICAgaWYgKHJvbGUudG9Mb3dlckNhc2UoKSA9PT0gXCJzZXBhcmF0b3JcIiAmJiBlbGUgJiYgQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShlbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImFyaWEtdmFsdWVub3dcIl0sIHJlcXVpcmVkQXR0cmlidXRlcyB8fCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRBdHRyaWJ1dGVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGlmIGEgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgaWYgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZXMgYXMgaW1wbGljaXQgcm9sZS5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gZmluZCBpZiBlbGVtZW50IGhhcyB0aGVzZSByb2xlcy5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aCBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKlxuICAgICAqIENvbnNpZGVyIHRvIHVzZSBoYXNSb2xlSW5TZW1hbnRpY3MoKSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzUm9sZShlbGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHsgIC8vQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL2lmIG5vbmUgb2YgdGhlIHRoZSBhdHRyaWJ1dGUgcm9sZXMgbWF0Y2hlZCB3aXRoIGdpdmVuIHJvbGVcbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBtYXRjaGVzLlxuICAgICAgICAvL05vdGU6IGVsZW1lbnQgY2FuIGhhdmUgbXVsdGlwbGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoaW1wbGljaXRSb2xlLCB3Um9sZXMpO1xuICAgICAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocm9sZSkgIT0gdHlwZW9mIChcIlwiKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB3Um9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHdSb2xlc1tpXSA9PT0gcm9sZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHJvbGUsIGluY2x1ZGluZyB0aGUgaW1wbGllZCByb2xlIGlmIHJvbGUgaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXBsYWNpbmcgdGhlIGhhc1JvbGUgZnVuY3Rpb25cbiAgICAgKlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byBmaW5kIGlmIGVsZW1lbnQgaGFzIHRoZXNlIHJvbGVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlSW5TZW1hbnRpY3MoZWxlLCByb2xlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJvbGVTcGVjaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZVNwZWNpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvbGVTcGVjaWZpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgbGV0IGltcFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgIGlmIChpbXBSb2xlcyAhPT0gbnVsbCAmJiBpbXBSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL2lmIHJvbGUgaXMgYXJyYXkgbG9vcCB0aHJ1IGFuZCBzZWUgaWYgYW55ICBvZiB0aGUgaW1wbGljaXQgcm9sZSBwcmVzZW50IGluIHRoZSBhcnJheVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAocm9sZSkgIT0gdHlwZW9mIChcIlwiKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCBpbXBSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBpbXBSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgaWYgYSBlbGVtZW50IGhhcyBnaXZlbiByb2xlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjaGVja3MgaWYgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZXMgYXMgaW1wbGljaXQgcm9sZXMuXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHJldFZhbCAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzQW55Um9sZShlbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgcmV0VmFsID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgZXhpc3QuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgICAgICBpZiAoaW1wUm9sZXMgIT09IG51bGwgJiYgaW1wUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc1ByZXNlbnRhdGlvbmFsRWxlbWVudChub2RlKSB7XG4gICAgICAgIC8vIEVsZW1lbnRzIGV4dHJhY3RlZCBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0hUTUwvRWxlbWVudCNJbmxpbmVfdGV4dF9zZW1hbnRpY3MsXG4gICAgICAgIC8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L2h0bWwtYXV0aG9yLyN0ZXh0LWxldmVsLXNlbWFudGljcyBhbmQgaHR0cHM6Ly93aWtpLndoYXR3Zy5vcmcvd2lraS9QcmVzZW50YXRpb25hbF9lbGVtZW50c19hbmRfYXR0cmlidXRlc1xuICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxFbGVtZW50cyA9IFtcImFiYnJcIiwgXCJiXCIsIFwiYmRpXCIsIFwiYmRvXCIsIFwiYnJcIiwgXCJjaXRlXCIsIFwiY29kZVwiLCBcImRhdGFcIiwgXCJkZm5cIixcbiAgICAgICAgICAgIFwiZW1cIiwgXCJpXCIsIFwia2JkXCIsIFwibWFya1wiLCBcInFcIiwgXCJycFwiLCBcInJ0XCIsIFwicnRjXCIsIFwicnVieVwiLCBcInNcIixcbiAgICAgICAgICAgIFwic2FtcFwiLCBcInNtYWxsXCIsIFwic3BhblwiLCBcInN0cm9uZ1wiLCBcInN1YlwiLCBcInN1cFwiLCBcInRpbWVcIiwgXCJ1XCIsXG4gICAgICAgICAgICBcInZhclwiLCBcIndiclwiLCBcImFcIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwiYmFzZWZvbnRcIiwgXCJiaWdcIiwgXCJjZW50ZXJcIixcbiAgICAgICAgICAgIFwic3RyaWtlXCIsIFwidHRcIiwgXCJmb250XCIsIFwiYmxpbmtcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIixcbiAgICAgICAgICAgIFwiaHJcIiwgXCJibG9ja3F1b3RlXCIsIFwicFwiXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLnZhbEluQXJyYXkobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBwcmVzZW50YXRpb25hbEVsZW1lbnRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCByb2xlLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgcGFyZW50IG5vZGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gVGhlIHJvbGUgdG8gc2VhcmNoIGZvciBvbiBhbiBlbGVtZW50IHVuZGVyIHRoZSBwcm92aWRlZCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhSb2xlKGVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHdhbGtOb2RlLCByb2xlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZSh3YWxrTm9kZSwgcm9sZU5hbWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBhbmQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHthcnJheX0gcm9sZXMgLSB0aGUgcm9sZSBuYW1lcyB0byBzZWFyY2ggZm9yXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhSb2xlcyhlbGVtZW50LCByb2xlTmFtZXMpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8ICFyb2xlTmFtZXMgfHwgIXJvbGVOYW1lcy5sZW5ndGggfHwgcm9sZU5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUod2Fsa05vZGUpO1xuICAgICAgICAgICAgaWYgKHJvbGUgIT09IG51bGwgJiYgcm9sZU5hbWVzLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcm9sZXMgd2l0aCBnaXZlbiByb2xlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHthcnJheX0gcm9sZVR5cGxlcyAtIHJvbGUgdHlwZXMsIHN1Y2ggYXMgJ3dpZGdldCcsICdzdHJ1Y3R1cmUnIGV0Yy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2FycmF5fSByb2xlcyAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNXaXRoVHlwZXMoZWxlbWVudCwgdHlwZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdHlwZXMgfHwgIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwicm9sZXNfd2l0aF9naXZlbl90eXBlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyh2YWx1ZS5yb2xlVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJyb2xlc193aXRoX2dpdmVuX3R5cGVzXCIsIHJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSByb2xlcyB3aXRoIGdpdmVuIHJvbGUgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlVHlwbGVzIC0gcm9sZSB0eXBlcywgc3VjaCBhcyAnd2lkZ2V0JywgJ3N0cnVjdHVyZScgZXRjLlxuICAgICAqXG4gICAgICogQHJldHVybiB7YXJyYXl9IHJvbGVzIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1dpZGdldChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiaXNfZWxlbWVudF93aWRnZXRcIiwgbnVsbCk7XG4gICAgICAgIGlmICh3aWRnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7IFxuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpXG4gICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJpc19lbGVtZW50X3dpZGdldFwiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgYSBub2RlIHdoaWNoIG1hdGNoZXMgdGhlIHJvbGUgYW5kIGlzIGEgc2libGluZyBvZiB0aGVcbiAgICAgKiBwcm92aWRlZCBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx0IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHNpYmxpbmcgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2libGluZ1dpdGhSb2xlKGVsZW1lbnQsIHJvbGUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIG5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgcm9sZSBhbmQgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gY29uc2lkZXJzIGltcGxpY2l0IHJvbGVzIGZvciB0aGUgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBjb25zaWRlciBlbGVtZW50cyB0aGF0IGFyZSBoaWRkZW4gYmFzZWQgb24gdGhlIGlmIHRoZSBDaGVja1xuICAgICAqIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIHNob3VsZCBiZSBjb25zaWRlcmVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHNpYmxpbmcgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdCAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgSW1wbGljaXQgcm9sZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSB3YWxrTm9kZSAtIEEgc2libGluZyBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFNpYmxpbmdXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlPykge1xuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCB3YWxrTm9kZSA9IG51bGw7XG4gICAgICAgIGxldCBoYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gT25seSBwZXJmb3JtIHRoZSBjaGVjayBpZiBlbGVtZW50IGFuZCByb2xlIGFyZSBib3RoIHByb3ZpZGVkXG4gICAgICAgIGlmIChlbGVtZW50ICYmIHJvbGUpIHtcbiAgICAgICAgICAgIC8vIEZldGNoIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudFxuICAgICAgICAgICAgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAvLyBLZWVwIGxvb3Bpbmcgb3ZlciB0aGUgbmV4dCBzaWJsaW5ncyB0byBmaW5kIGVsZW1lbnQgd2hpY2ggbWF0Y2hlc1xuICAgICAgICAgICAgLy8gdGhlIHByb3ZpZGVkIHJvbGUuXG4gICAgICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwgJiYgIWhhc1JvbGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb24gdG8gdGhlIG5leHQgbm9kZVxuICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgdGhhdCB3ZSBuZWVkIHRvIGNoZWNrIGV4aXN0c1xuICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNSb2xlID0gQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHdhbGtOb2RlLCByb2xlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoYXNSb2xlID0gQXJpYVV0aWwuaGFzUm9sZSh3YWxrTm9kZSwgcm9sZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1vdmUgb24gdG8gdGhlIG5leHQgbm9kZVxuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgbm90IGZvdW5kIGEgbm9kZSB0aGF0IG1hdGNoZXMgdGhlIHJvbGUsIHN0YXJ0IGEgcmV2ZXJzZSBsb29rIHVwXG4gICAgICAgICAgICBpZiAoIXdhbGtOb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIHByZXZpb3VzIFNpYmxpbmcgb2YgdGhpcyBlbGVtZW50XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSBlbGVtZW50LnByZXZpb3VzU2libGluZztcblxuICAgICAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIGFsbCB0aGUgcHJldmlvdXMgc2libGluZ3MgdG8gc2VhcmNoIGZvciBhbiBlbGVtZW50IHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwgJiYgIWhhc1JvbGUpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgb24gdG8gdGhlIG5leHQgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBjb25zaWRlckltcGxpY2l0Um9sZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIGEgZGVzY2VuZGFudCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCByb2xlLCB1bmRlclxuICAgICAqIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZSBieSBkZWZhdWx0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgY29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnQncyBlbGVtZW50c1xuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZGVzY2VuZGFudCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSBzcGVjaWZpZWQgKG9ubHkgb25lKVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXNjZW5kYW50V2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZGVzY2VuZGFudCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSBzcGVjaWZpZWQgKG9ubHkgb25lKVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgZGVzY2VuZGFudCA9IG51bGw7XG4gICAgICAgIC8vbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG5cbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHNwZWNpZmllZCwgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSBpbXBsaWNpdCByb2xlcywgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzID8gQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKG53Lm5vZGUsIHJvbGVOYW1lKSA6IEFyaWFVdGlsLmhhc1JvbGUobncubm9kZSwgcm9sZU5hbWUsIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnQgPSBudy5ub2RlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBBbGwgZGVzY2VuZGFudCBlbGVtZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZXMsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nW119IHJvbGVOYW1lcyAtIFRoZSByb2xlcyB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudCdzIGVsZW1lbnRzXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGVbXX0gLSBhbGwgZGVzY2VuZGFudCBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSByb2xlcyBzcGVjaWZpZWRcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZXMoZWxlbWVudCwgcm9sZU5hbWVzOiBzdHJpbmdbXSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgaWYgKCFyb2xlTmFtZXMgfHwgcm9sZU5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgZGVzY2VuZGFudHMgPSBbXTtcblxuICAgICAgICByb2xlTmFtZXMuZm9yRWFjaChyb2xlTmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQga2lkcyA9IEFyaWFVdGlsLmdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzKTtcbiAgICAgICAgICAgIGlmIChraWRzICYmIGtpZHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBkZXNjZW5kYW50cyA9IGRlc2NlbmRhbnRzLmNvbmNhdChraWRzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlLCB1bmRlclxuICAgICAqIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudCdzIGVsZW1lbnRzXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGVbXX0gLSBUaGUgZGVzY2VuZGFudCBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSByb2xlIHNwZWNpZmllZFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxEZXNjZW5kYW50c1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lOiBzdHJpbmcsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuICAgICAgICAvL2xldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgcHJvdmlkZWQgYW5kIGNoZWNrIGlmIHRoZSByb2xlbmFtZSBwcm92aWRlZCBleGlzdHNcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50ICYmIG53Lm5vZGUgIT0gZWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHNwZWNpZmllZCwgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSBpbXBsaWNpdCByb2xlcywgaWYgaXQgZG9lcyB0aGVuIHNldCB0aGlzIGFzIHRoZSBkZXNjZW5kYW50IGFuZCBzdG9wIGNoZWNraW5nIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCByb2xlTmFtZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSkge1xuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzLnB1c2gobncubm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBBbGwgZGlyZWN0IGNoaWxkcmVuIGluIEFUIHRyZWUgd2l0aCBhIHJvbGUgKGV4Y2x1ZGUgbm9uZSBhbmQgcHJlc2VudGF0aW9uKVxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBjaGlsZHJlbiBmb3JcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkaXJlY3QgY2hpbGQgZWxlbWVudHMgaW4gQVQgdHJlZSB0aGF0IGhhcyBhIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGlyZWN0QVRDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCByZXF1aXJlZENoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSZXF1aXJlZENoaWxkUm9sZXMoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGxldCBkaXJlY3Q6IEFycmF5PEhUTUxFbGVtZW50PiA9IFtdO1xuICAgICAgICBBcmlhVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oZWxlbWVudCwgcmVxdWlyZWRDaGlsZFJvbGVzLCBkaXJlY3QpO1xuICAgICAgICByZXR1cm4gZGlyZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJlY3Vyc2l2ZWx5IGFueSBjaGlsZCBwYXRoIHRpbGwgZWl0aGVyIG5vIGNoaWxkIG9yIGEgY2hpbGQgd2l0aCBhIHJvbGUgaXMgZm91bmQgKGV4Y2x1ZGUgbm9uZSBhbmQgcHJlc2VudGF0aW9uKVxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBjaGlsZHJlbiBmb3JcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkaXJlY3QgY2hpbGQgZWxlbWVudHMgaW4gQVQgdHJlZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oZWxlbWVudCwgcmVxdWlyZWRDaGlsZFJvbGVzLCBkaXJlY3Q6IEFycmF5PEhUTUxFbGVtZW50Pikge1xuICAgICAgICBsZXQgY2hpbGRyZW46IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gIT09IG51bGwgJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIFwiYXJpYS1vd25cIiBhdHRyaWJ1dGUsIHRoZW4gdGhlIGFyaWEtb3duZWQgY2hpbGRyZW4gbmVlZCB0byBiZSBpbmNsdWRlZCB0b29cbiAgICAgICAgbGV0IG93bmVkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG4gICAgICAgIGlmIChvd25lZCkge1xuICAgICAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3duZWRJZHMgPSBvd25lZC5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvd25lZElkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRFbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKG93bmVkSWRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChvd25lZEVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy9pZ25vcmUgaGlkZGVuIGFuZCBpbnZpc2libGUgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoY2hpbGRyZW5baV0pIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY2hpbGRyZW5baV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhjaGlsZHJlbltpXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChyb2xlcyA9PT0gbnVsbCB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcyAhPT0gbnVsbCAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vcmVtb3ZlICdub25lJyBhbmQgJ3ByZXNlbnRhdGlvbidcbiAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb2xlICE9PSBcIm5vbmVcIiAmJiByb2xlICE9PSBcInByZXNlbnRhdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgJ2dyb3VwJyByb2xlIGlzIGFsbG93ZWQgYnV0IG5vdCByZXF1aXJlZCBmb3Igc29tZSBlbGVtZW50cyBzbyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlcy5pbmNsdWRlcyhcImdyb3VwXCIpICYmIHJlcXVpcmVkQ2hpbGRSb2xlcyAmJiByZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMoJ2dyb3VwJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVzID0gcm9sZXMuZmlsdGVyKGZ1bmN0aW9uIChyb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09ICdncm91cCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcyAhPT0gbnVsbCAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWN1cnNpdmUgdW50aWwgZ2V0IGEgcmV0dXJuIHZhbHVlLCBcbiAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwucmV0cmlldmVEaXJlY3RBVENoaWxkcmVuKGNoaWxkcmVuW2ldLCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIG51bGwgb3IgcmVxdWlyZWQgY2hpbGQgcm9sZXMgZm9yIGEgZ2l2ZW4gZWxlbWVudCB3aXRoIG9uZSBtb3JlIHJvbGVzLFxuICAgICAqIHJldHVybiBudWxsIGlmIHRoZSByb2xlIGlzICdub25lJyBvciAncHJlc2VudGF0aW9uJ1xuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSBpbmNsdWRlSW1wbGljaXQgaW5jbHVkZSBpbXBsaWNpdCByb2xlcyBpZiBubyByb2xlIGlzIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJlcXVpcmVkQ2hpbGRSb2xlcyhlbGVtZW50LCBpbmNsdWRlSW1wbGljaXQ6IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApICYmIGluY2x1ZGVJbXBsaWNpdCkge1xuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiogIFxuICAgICAgICAgKiBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlXG4gICAgICAgICovXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBjb250YWlucyBub25lIG9yIHByZXNlbnRhdGlvbiByb2xlXG4gICAgICAgICovXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25Sb2xlcyA9IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl07XG4gICAgICAgIGNvbnN0IGZvdW5kID0gcm9sZXMuc29tZShyID0+IHByZXNlbnRhdGlvblJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCByZXF1aXJlZENoaWxkUm9sZXM6IHN0cmluZ1tdID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0gJiYgZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDaGlsZFJvbGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbiwgcmVxdWlyZWRDaGlsZFJvbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVxdWlyZWRDaGlsZFJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogTm90ZSBieSBkZWZhdWx0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgY29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGNoZWNrIGZvciBhcmlhLW93bnNcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBhcmlhLW93bnMgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIGFuIGVsZW1lbnQgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyB0aGVcbiAgICAgKiByb2xlIHRoYXQgd2FzIHNwZWNpZmllZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2sgZm9yIGFyaWEtb3duc1xuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGFyaWEtb3ducyBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHJvbGUgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgbGV0IHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIGFyaWEtb3ducyBpcyBub3Qgb24gdGhlIGVsZW1lbnQganVzdCBicmVhayBvdXQgb2YgdGhpcyBmdW5jdGlvbiB3aXRoIG51bGxcbiAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLW93bnNcIikpIHtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSByZWZlcmVuY2UgSURcbiAgICAgICAgICAgIGxldCByZWZlcmVuY2VJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgZm9yIHRoZSByZWZlcmVuY2UgSURcbiAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbWVudCwgcmVmZXJlbmNlSUQpO1xuICAgICAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGFyaWEtb3ducyBwb2ludCB0byB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKGVsZW1lbnQsIHJlZmVyZW5jZWRFbGVtZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiByZWZlcmVuY2VkRWxlbWVudCAhPSBudWxsICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyZWZlcmVuY2VkRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlKHJlZmVyZW5jZWRFbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmZXJlbmNlZEVsZW1IYXNSb2xlID8gcmVmZXJlbmNlZEVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBBUklBIGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNBcmlhTGFiZWwoZWxlbWVudCkge1xuXG4gICAgICAgIC8vIFJwdF9BcmlhX1ZhbGlkSWRSZWYgZGV0ZXJtaW5lcyBpZiB0aGUgYXJpYS1sYWJlbGxlZGJ5IGlkIHBvaW50cyB0byBhIHZhbGlkIGVsZW1lbnRcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVsc1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzVW5pcXVlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIGlzR2xvYmFsKSB7XG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnRzWzBdLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBoYXNEdXBsaWNhdGVMYWJlbHMgPSBmYWxzZTtcbiAgICAgICAgbGV0IHVuaXF1ZUFyaWFMYWJlbHMgPSBudWxsO1xuXG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pcXVlQXJpYUxhYmVscyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFMYWJlbCA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBhcmlhTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1thcmlhTGFiZWxdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbE5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50c1tpXSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZW1lbnRzW2ldKSA/IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGxhYmVsTm9kZSkgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBub3JtYWxpemVkTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1tub3JtYWxpemVkTGFiZWxdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhcyBubyBsYWJlbCBhdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZSkgPyBDb21tb25VdGlsLmdldElubmVyVGV4dChsYWJlbE5vZGUpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRMYWJlbC50cmltKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhRGVzY3JpcHRpb24oZWxlKSB7XG4gICAgICAgIGlmICghZWxlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IFwiXCI7XG4gICAgICAgIGxldCBkZXNjID0gZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZGVzYy50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGUpID8gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQobGFiZWxOb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRMYWJlbC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZExhYmVsLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlc2MgPSBlbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1kZXNjcmlwdGlvblwiKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBkZXNjLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaW5kQXJpYUxhYmVsRHVwZXMoZWxlbWVudHMpIHtcbiAgICAgICAgbGV0IGR1cGVNYXAgPSB7fVxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgICAgICAgIGR1cGVNYXBbQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKGVsZSldID0gKGR1cGVNYXBbQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKGVsZSldIHx8IDApICsgMTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGR1cGVNYXA7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVW5pcXVlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaGFzVW5pcXVlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHNcbiAgICBwdWJsaWMgc3RhdGljIGhhc0R1cGxpY2F0ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCBpc0dsb2JhbCkge1xuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50c1swXS5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIGxldCBoYXNEdXBsaWNhdGVMYWJlbHMgPSBmYWxzZTtcbiAgICAgICAgbGV0IHVuaXF1ZUFyaWFMYWJlbHM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0gbnVsbDtcbiAgICAgICAgbGV0IGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5ID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFMYWJlbCA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBhcmlhTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1thcmlhTGFiZWxdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXJpYUxhYmVsIGluIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbYXJpYUxhYmVsXSA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0ucHVzaChlbGVtZW50c1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEID0gbGFiZWxJRHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbWVudHNbaV0sIGxhYmVsSUQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbWVudHNbaV0pID8gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQobGFiZWxOb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCB1bmlxdWVBcmlhTGFiZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFJlZiA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpO1xuICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGxhYmVsUmVmIGluIGxhYmVsUmVmcztcbiAgICAgICAgICAgICAgICBsYWJlbFJlZnNbbGFiZWxSZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWhhc0R1cGxpY2F0ZUxhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgQVJJQSByZXF1aXJlbWVudHMgZm9yIGFuIEhUTUwgZWxlbWVudCBwZXIgQVJJQSBpbiBIVE1MXG4gICAgICogQHBhcmFtIHJ1bGVDb250ZXh0IHRoZSBIVE1MIGVsZW1lbnQgdG8gYmUgZXhhbWluZWRcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5OiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcblxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcmVhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmY3MgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWcocnVsZUNvbnRleHQsIFwiZmlnY2FwdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZjcyAhPT0gbnVsbCAmJiBmY3MubGVuZ3RoID4gMCA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1maWdjYXB0aW9uXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLWZpZ2NhcHRpb25cIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZm9vdGVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJoZWFkZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImFydGljbGVcIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIsIHRydWUpICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJuYXZpZ2F0aW9uXCIsIHRydWUpICE9PSBudWxsIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwicmVnaW9uXCIsIHRydWUpICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYXJ0aWNsZVwiLCBcImFzaWRlXCIsIFwibWFpblwiLCBcIm5hdlwiLCBcInNlY3Rpb25cIl0pICE9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJvdGhlclwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWx0XCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCAhPT0gMCB8fCAoYWx0ICE9PSBudWxsICYmIGFsdC5sZW5ndGggPiAwKSB8fCAodGl0bGUgIT09IG51bGwgJiYgdGl0bGUubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW1nIGhhcyBub24tZW1wdHkgYWx0IChhbHQ9XCJzb21lIHRleHRcIiBvciBhbHQ9XCIgIFwiKSBvciBhbiBhY2Nlc3NpYmxlIG5hbWUgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGgtYWNjbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW1nIGhhcyBhbiBlbXB0eSBhbHQgKGFsdD1cIlwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImltZy13aXRob3V0LWFjY25hbWUtZW1wdHktYWx0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgbGFja3MgYW4gYWx0IGF0dHJpYnV0ZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImltZy13aXRob3V0LWFjY25hbWUtbm8tYWx0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInR5cGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1t0eXBlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgPT09IG51bGwgfHwgdGFnUHJvcGVydHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYXJpYS1wcmVzc2VkXCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoZWNrYm94LXdpdGgtYXJpYS1wcmVzc2VkXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoZWNrYm94LXdpdGhvdXQtYXJpYS1wcmVzc2VkXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImVtYWlsLXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJlbWFpbC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNlYXJjaFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJzZWFyY2gtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInNlYXJjaC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRlbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZWwtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRlbC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGV4dC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGV4dC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInVybFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ1cmwtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInVybC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlZmF1bHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlZmF1bHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0eXBlIGlzIHRoZSBzYW1lIGFzIHR5cGU9dGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxpXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcImxpXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQgJiYgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQsIFwibGlzdFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtb2YtbGlzdC1yb2xlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1jaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNlY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbmFtZSA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAobmFtZSAmJiBuYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGgtbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtbmFtZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInNlbGVjdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic2l6ZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzaXplXCIpID4gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tbXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3VtbWFyeVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbXCJzdW1tYXJ5XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQgJiYgcnVsZUNvbnRleHQucGFyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGV0YWlscydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBET01VdGlsLnNhbWVOb2RlKFsuLi5ydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWxlbSA9PiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JylbMF0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWZpcnN0LXN1bW1hcnktb2YtZGV0YWlsXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0Ym9keVwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0YWJsZVwiLCB0cnVlKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiZ3JpZFwiLCB0cnVlKSB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRyZWVncmlkXCIsIHRydWUpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1ncmlkXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1vdGhlclwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGhcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIsIHRydWUpICE9PSBudWxsIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRyZWVncmlkXCIsIHRydWUpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBDb21tb25VdGlsLmdldFNjb3BlRm9yVGgocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZSA9PT0gJ2NvbHVtbicpIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtZ3JpZC10cmVlZ3JpZC1jb2x1bW4tc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlLWdyaWQtdHJlZWdyaWQtcm93LXNjb3BlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkaXZcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcnQgPSBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJ0ICE9PSBudWxsICYmIHBydC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGwnID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWRsXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLWRsXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcImRlZmF1bHRcIl0gYXMgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDtcbiAgICAgICAgICAgICAgICB9IC8vc3dpdGNoXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgdGFnUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbG93ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQsIHByb3BlcnRpZXM6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQpIHtcbiAgICAgICAgbGV0IGFsbG93ZWRSb2xlczogc3RyaW5nW10gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfQWxsb3dlZEFyaWFSb2xlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkUm9sZXMpIHtcbiAgICAgICAgICAgIGFsbG93ZWRSb2xlcyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5OiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSBudWxsICYmIHByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gcHJvcGVydGllcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ICE9PSBudWxsICYmIHRhZ1Byb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS52YWxpZFJvbGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS52YWxpZFJvbGVzLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMgJiYgaW1wbGljaXRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS52YWxpZFJvbGVzLCBhbGxvd2VkUm9sZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dCwgXCJBcmlhVXRpbF9BbGxvd2VkQXJpYVJvbGVzXCIsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbG93ZWRSb2xlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHByb3BlcnRpZXMpIHtcbiAgICAgICAgbGV0IGFsbG93ZWRBdHRyaWJ1dGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJBcmlhVXRpbF9BbGxvd2VkQXJpYUF0dHJpYnV0ZXNcIiwgbnVsbCk7XG4gICAgICAgIGlmICghYWxsb3dlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbLi4ucm9sZXNdO1xuICAgICAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgZGlzYWJsZWQgYXR0cmlidXRlICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZGlzYWJsZWQtZWxlbWVudHMuaHRtbFxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWREaXNhYmxlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLWRpc2FibGVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVsZW1lbnQgd2l0aCBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBodHRwOi8vd3d3LnRoZS1hcnQtb2Ytd2ViLmNvbS9odG1sL2h0bWw1LWZvcm0tdmFsaWRhdGlvbi9cbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkUmVxdWlyZWQuaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcmlhLXJlcXVpcmVkIGF0dHJpYnV0ZSBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIGFsbG93ZWQgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBpbiBIVE1MNS5cbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKFwiYXJpYS1yZXF1aXJlZFwiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkUmVhZE9ubHkuaW5kZXhPZih0YWdOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBhcmlhLXJlYWRvbmx5IGF0dHJpYnV0ZSBvbiBhbnkgZWxlbWVudCB0aGF0IGlzIGFsbG93ZWQgdGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBpbiBIVE1MNS5cbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKFwiYXJpYS1yZWFkb25seVwiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IG51bGw7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHByb3BlcnRpZXM7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcblxuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ICE9PSBudWxsICYmIHRhZ1Byb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGltcGxpY2l0IHJvbGUgYWxsb3dlZCBhdHRyaWJ1dGVzIHRvIHRoZSBhbGxvd2VkIHJvbGUgbGlzdCBpZiB0aGVyZSBpcyBubyBzcGVjaWZpZWQgcm9sZVxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGFsbG93IHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAocGVybWl0dGVkUm9sZXMgPT09IG51bGwgfHwgcGVybWl0dGVkUm9sZXMgPT09IHVuZGVmaW5lZCB8fCBwZXJtaXR0ZWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICYmIHRhZ1Byb3BlcnR5LmFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0eSA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1t0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGVbaV1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVQcm9wZXJ0eSAhPT0gbnVsbCAmJiByb2xlUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9wZXJ0aWVzID0gcm9sZVByb3BlcnR5LnByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9wZXJ0aWVzLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXModGFnUHJvcGVydHkuaW1wbGljaXRSb2xlW2ldLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvaGliaXRlZFByb3BzID0gcm9sZVByb3BlcnR5LnByb2hpYml0ZWRQcm9wcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZFByb3BzICYmIHByb2hpYml0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvaGliaXRlZFByb3BzLCBwcm9oaWJpdGVkQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXSA9PT0gXCJzZXBhcmF0b3JcIiAmJiBDb21tb25VdGlsLmlzRm9jdXNhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtdmFsdWVub3dcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZGluZyB0aGUgZ2xvYmFsIHByb3BlcnRpZXMgdG8gdGhlIHZhbGlkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5Lmdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllczsgLy8gZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGRpbmcgdGhlIG90aGVyIHJvbGUgdG8gdGhlIGFsbG93ZWQgcm9sZXMgZm9yIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QodGFnUHJvcGVydHkub3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXMsIHBlcm1pdHRlZFJvbGVzKTtcbiAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgc3BlY2lmaWVkIHJvbGUgcHJvcGVydGllcyB0byB0aGUgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBlcm1pdHRlZFJvbGVzICE9PSBudWxsICYmIGkgPCBwZXJtaXR0ZWRSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByb2xlUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1twZXJtaXR0ZWRSb2xlc1tpXV07XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVQcm9wZXJ0aWVzICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBwcm9wZXJ0aWVzIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgYXR0cmlidXRlcyBmcm9tIHRoZSBpbXBsaWNpdCByb2xlXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFnUHJvcGVydHkgfHwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlID09PSBudWxsIHx8ICF0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUuaW5jbHVkZXMocGVybWl0dGVkUm9sZXNbaV0pIHx8ICh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUuaW5jbHVkZXMocGVybWl0dGVkUm9sZXNbaV0pICYmIHRhZ1Byb3BlcnR5LmFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGUgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9wZXJ0aWVzID0gcm9sZVByb3BlcnRpZXMucHJvcHM7IC8vIGFsbG93ZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHBlcm1pdHRlZFJvbGVzW2ldLCBydWxlQ29udGV4dCk7IC8vIHJlcXVpcmVkIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9wZXJ0aWVzLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRQcm9wcyA9IHJvbGVQcm9wZXJ0aWVzLnByb2hpYml0ZWRQcm9wcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2hpYml0ZWRQcm9wcyAmJiBwcm9oaWJpdGVkUHJvcHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcm1pdHRlZFJvbGVzW2ldID09PSBcInNlcGFyYXRvclwiICYmIENvbW1vblV0aWwuaXNGb2N1c2FibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWdub3JlIGFyaWEtbGV2ZWwsIGFyaWEtc2V0c2l6ZSBvciBhcmlhLXBvc2luc2V0IGlmIFwicm93XCIgaXMgbm90IGluIHRyZWVncmlkXG4gICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXMuaW5jbHVkZXMoXCJyb3dcIikgJiYgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0cmVlZ3JpZFwiLCB0cnVlKSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgaWYgKChpbmRleCA9IGFsbG93ZWRBdHRyaWJ1dGVzLmluZGV4T2YoXCJhcmlhLWxldmVsXCIpKSA+IC0xKVxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChpbmRleCA9IGFsbG93ZWRBdHRyaWJ1dGVzLmluZGV4T2YoXCJhcmlhLXNldHNpemVcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtcG9zaW5zZXRcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRkIHRoZSBvdGhlciBhbGxvd2VkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoYWxsb3dlZCwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIHRoZSBvdGhlciBwcm9oaWJpdHRlZCBhdHRyaWJ1dGVzIGZvciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ICYmIHRhZ1Byb3BlcnR5Lm90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzICYmIHRhZ1Byb3BlcnR5Lm90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBhdHRyaWJ1dGUtdmFsdWUgcGFpciBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWxsb3dlZCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9IHRhZ1Byb3BlcnR5Lm90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzW3BdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBhdHRyLnNwbGl0KFwiPVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUocGFpclswXSkgPT09IHBhaXJbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZC5wdXNoKHBhaXJbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ZWQucHVzaChhdHRyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRpc2FsbG93ZWQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGRpc2FsbG93ZWQsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vZXhjbHVkZSB0aGUgcHJvaGliaXRlZEF0dHJpYnV0ZXMgZnJvbSB0aGUgYWxsb3dlZEF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRBdHRyaWJ1dGVzLCBhbGxvd2VkQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgIC8vZXhjbHVkZSBhcmlhIGF0dHJpYnV0ZSBmb3IgZWxlbWVudHMgd2l0aG91dCBpbXBsaWNpdCByb2xlIGFuZCB3aXRoICdOYW1pbmcgUHJvaGliaXRlZCdcbiAgICAgICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlID09PSBudWxsICYmIHRhZ1Byb3BlcnR5LnByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZSlcbiAgICAgICAgICAgICAgICBhbGxvd2VkQXR0cmlidXRlcyA9IENvbW1vblV0aWwucmVkdWNlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS5wcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGUsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhQXR0cmlidXRlc1wiLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbG93ZWRBdHRyaWJ1dGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYXJpYUF0dHIgXG4gICAgICogQHBhcmFtIGh0bWxBdHRycyBcbiAgICAgKiBAdHlwZTogY29uZmxpY3Qgb3Igb3ZlcmxhcHBpbmdcbiAgICAgKiBAcmV0dXJucyBodG1sQXR0ck5hbWUsICdQYXNzJyBvciBudWxsXG4gICAgICogICAgICAgICBodG1sQXR0ck5hbWUgdGhhdCBjb25mbGljdHMgd2l0aCB0aGUgYXJpYUF0dHIsIFxuICAgICAqICAgICAgICAgJ1Bhc3MnIHdpdGggbm8gY29uZmxpY3Qgd2l0aCB0aGUgYXJpYUF0dHIsIFxuICAgICAqICAgICAgICAgb3IgbnVsbCB3aGVyZSBhcmlhQXR0ciB3b24ndCBjYXVzZSBjb25mbGljdFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0ciwgaHRtbEF0dHJzLCB0eXBlKTogYW55W10gfCBudWxsIHtcbiAgICAgICAgbGV0IGV4aXN0ID0gQVJJQURlZmluaXRpb25zLnJlbGF0ZWRBcmlhSHRtbEF0dHJpYnV0ZXNbYXJpYUF0dHJbJ25hbWUnXV07XG4gICAgICAgIGlmIChleGlzdCkge1xuICAgICAgICAgICAgaWYgKCFhcmlhQXR0ciB8fCBhcmlhQXR0ci5sZW5ndGggPT0gMCB8fCAhaHRtbEF0dHJzIHx8IGh0bWxBdHRycy5sZW5ndGggPT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgICAgICAgICBsZXQgZXhhbWluZWRIdG1sQXRyTmFtZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCBjb25jZXJuVHlwZXMgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdjb25mbGljdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0LmNvbmZsaWN0IHx8IE9iamVjdC5rZXlzKGV4aXN0LmNvbmZsaWN0KS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbmNlcm5UeXBlcyA9IGV4aXN0LmNvbmZsaWN0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3ZlcmxhcHBpbmcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFleGlzdC5vdmVybGFwcGluZyB8fCBPYmplY3Qua2V5cyhleGlzdC5vdmVybGFwcGluZykubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25jZXJuVHlwZXMgPSBleGlzdC5vdmVybGFwcGluZztcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBsZXQgYXBwbGljYWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGZhaWwgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29uY2VyblR5cGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcm5BcmlhVmFsdWUgPSBjb25jZXJuVHlwZXNba10uYXJpYUF0dHJpYnV0ZVZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXJuSHRtbE5hbWVzID0gY29uY2VyblR5cGVzW2tdLmh0bWxBdHRyaWJ1dGVOYW1lcztcbiAgICAgICAgICAgICAgICBsZXQgY29uY2Vybkh0bWxWYWx1ZXMgPSBjb25jZXJuVHlwZXNba10uaHRtbEF0dHJpYnV0ZVZhbHVlcztcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaHRtbEF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGNvbmNlcm5IdG1sTmFtZXMuaW5kZXhPZihodG1sQXR0cnNbaV1bJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWxWYWx1ZXNJbkNvbmNlcm4gPSAoY29uY2Vybkh0bWxWYWx1ZXMgPT09IG51bGwgfHwgY29uY2Vybkh0bWxWYWx1ZXNbaW5kZXhdID09PSBudWxsKSA/IG51bGwgOiBjb25jZXJuSHRtbFZhbHVlc1tpbmRleF0uc3BsaXQoXCIsXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChodG1sVmFsdWVzSW5Db25jZXJuID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4uaW5jbHVkZXMoaHRtbEF0dHJzW2ldWyd2YWx1ZSddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHsgcmVzdWx0OiAnRmFpbGVkJywgJ2F0dHInOiBodG1sQXR0cnNbaV1bJ25hbWUnXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChodG1sVmFsdWVzSW5Db25jZXJuID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmNlcm5BcmlhVmFsdWUgPT09IGFyaWFBdHRyWyd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNlcm5BcmlhVmFsdWUgPT09ICdWQUxVRScgJiYgaHRtbFZhbHVlc0luQ29uY2Vybi5pbmNsdWRlcygnVkFMVUUnKSAmJiBodG1sVmFsdWVzSW5Db25jZXJuWzBdICE9PSBhcmlhQXR0clsndmFsdWUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25jZXJuQXJpYVZhbHVlID09PSBhcmlhQXR0clsndmFsdWUnXSAmJiBodG1sVmFsdWVzSW5Db25jZXJuLmluY2x1ZGVzKGh0bWxBdHRyc1tpXVsndmFsdWUnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHsgcmVzdWx0OiAnRmFpbGVkJywgJ2F0dHInOiBodG1sQXR0cnNbaV1bJ25hbWUnXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFwcGxpY2FibGUgJiYgIWZhaWwpXG4gICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ1Bhc3MnLCAnYXR0cic6ICcnIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZXhhbWluZWRIdG1sQXRyTmFtZXM7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KGVsZW06IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW0sIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW0pO1xuXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgcm9sZXMgIT09IG51bGwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcm9sZVByb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbaV1dO1xuICAgICAgICAgICAgaWYgKHJvbGVQcm9wZXJ0aWVzICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGlvbmFsID0gcm9sZVByb3BlcnRpZXMucHJlc2VudGF0aW9uYWxDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICBpZiAocHJlc2VudGlvbmFsID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlOiBFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgLy9hcmlhLW93biBjYXNlOiBpZiB0aGUgZWxlbWVudCBpcyByZWZlcnJlZCBieSBhbiBhcmlhLXdvblxuICAgICAgICAgICAgd2Fsa05vZGUgPSBBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHdhbGtOb2RlIGFzIEhUTUxFbGVtZW50KSB8fCBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIFxuICogY2hlY2sgaWYgYW55IGV4cGxpY2l0IHJvbGUgc3BlY2lmaWVkIGZvciB0aGUgZWxlbWVudCBpcyBhIHZhbGlkIEFSSUEgcm9sZVxuICogcmV0dXJuOiBudWxsIGlmIG5vIGV4cGxpY2l0IHJvbGUgaXMgZGVmaW5lZCwgXG4gKiAgICAgICAgIHRydWUgaWYgdGhlIHJvbGUocykgYXJlIGRlZmluZWQgaW4gQVJJQVxuICogICAgICAgICBmYWxzZSBpZiBhbnkgcm9sZSBpcyBub3QgZGVmaW5lZCBpbiBBUklBXG4qL1xuICAgIHB1YmxpYyBzdGF0aWMgYXJlUm9sZXNEZWZpbmVkKHJvbGVzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpXG4gICAgICAgICAgICBpZiAoIShyb2xlLnRvTG93ZXJDYXNlKCkgaW4gZGVzaWduUGF0dGVybnMpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gICAgICogcmV0dXJuOiBudWxsIGlmIG5vIGV4cGxpY2l0IHJvbGUgaXMgZGVmaW5lZCwgXG4gICAgICogICAgICAgICB0cnVlIGlmIHRoZSByb2xlKHMpIGFyZSBkZWZpbmVkIGluIEFSSUFcbiAgICAgKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW52YWxpZFJvbGVzKHJ1bGVDb250ZXh0OiBFbGVtZW50KSB7XG4gICAgICAgIGxldCBkb21Sb2xlczogc3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBpZiAoIWRvbVJvbGVzIHx8IGRvbVJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGNoZWNrIHRoZSAnZ2VuZXJpYycgcm9sZSBmaXJzdFxuICAgICAgICBpZiAoZG9tUm9sZXMgJiYgZG9tUm9sZXMuaW5jbHVkZXMoJ2dlbmVyaWMnKSlcbiAgICAgICAgICAgIHJldHVybiBbXCJnZW5lcmljXCJdO1xuXG4gICAgICAgIC8vIEZhaWxpbmcgcm9sZXNcbiAgICAgICAgbGV0IGZhaWxSb2xlVG9rZW5zID0gW107XG4gICAgICAgIC8vIFBhc3Npbmcgcm9sZXNcbiAgICAgICAgbGV0IHBhc3NSb2xlVG9rZW5zID0gW107XG5cbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBhbGxvd2VkUm9sZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYVJvbGVzKHJ1bGVDb250ZXh0LCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgIGlmICghYWxsb3dlZFJvbGVzIHx8IGFsbG93ZWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gZG9tUm9sZXM7XG5cbiAgICAgICAgbGV0IGludmFsaWRSb2xlcyA9IFtdO1xuXG4gICAgICAgIGlmIChhbGxvd2VkUm9sZXMuaW5jbHVkZXMoJ2FueScpKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tUm9sZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcy5pbmNsdWRlcyhkb21Sb2xlc1tpXSkgJiYgIWludmFsaWRSb2xlcy5pbmNsdWRlcyhkb21Sb2xlc1tpXSkpXG4gICAgICAgICAgICAgICAgaW52YWxpZFJvbGVzLnB1c2goZG9tUm9sZXNbaV0pO1xuXG4gICAgICAgIHJldHVybiBpbnZhbGlkUm9sZXM7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogY2hlY2sgaWYgYW55IGV4cGxpY2l0IHJvbGUgc3BlY2lmaWVkIGZvciB0aGUgZWxlbWVudCBpcyBub3QgZGVmaW5lZCBpbiBBUklBXG4gICAgICogcmV0dXJuOiBsaXN0IG9mIHNwZWNpZmllZCByb2xlcyBub3QgZGVmaW5lZCBpbiBBUklBXG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgbGV0IHVuZGVmaW5lZFJvbGVzID0gW107XG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEocm9sZXNbaV0gaW4gZGVzaWduUGF0dGVybnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFJvbGVzLnB1c2gocm9sZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkUm9sZXM7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogdGhpcyBtZXRob2QgZmlyc3QgY2hlY2tzIGV4cGxpY2l0IHJvbGVzLCBpZiBubyBleHBsaWNpdCByb2xlLCBpdCB3aWxsIGNoZWNrIHRoZSBpbXBsaWNpdCByb2xlXG4gICAgICogcmV0dXJuOiBudWxsIGlmIGFueSBleHBsaWNpdCByb2xlIGlzIGludmFsaWQsIFxuICAgICAqICAgICAgICAgYSBsaXN0IG9mIGludmFsaWQgYXR0cmlidXRlc1xuICAgICAqICAgICAgICAgZW1wdHkgbGlzdCBpZiBhbGwgYXR0cmlidXRlcyBhcmUgdmFsaWQsIG9yIG5vIGFyaWEgYXR0cmlidXRlcyBhcmUgc3BlY2lmaWVkXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICAvLyBmb3IgbXV0aXBsZSByb2xlcywgc2tpcCBpZiBhbnkgcm9sZSBpcyBpbnZhbGlkXG4gICAgICAgIGxldCBkZWZpbmVkID0gQXJpYVV0aWwuYXJlUm9sZXNEZWZpbmVkKHJvbGVzKTtcbiAgICAgICAgaWYgKGRlZmluZWQgIT09IG51bGwgJiYgIWRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgYXR0cnMgPSBbXTtcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBsZXQgYXJpYV9hdHRyczogc3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy8gQXR0cmlidXRlcyBhbGxvd2VkIG9uIHRoaXMgbm9kZVxuICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHJvbGVzLCB0YWdQcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKGFyaWFfYXR0cnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYV9hdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGFyaWFfYXR0cnNbaV0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIWF0dHJzLmluY2x1ZGVzKGF0dHJOYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF0dHJzO1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGdldCBjb25mbGljdCBBcmlhIGFuZCBIdG1sIGF0dHJpYnV0ZXNcbiAgICAgKiByZXR1cm46IGEgbGlzdCBvZiBBcmlhIGFuZCBIdG1sIGF0dHJpYnV0ZSBwYWlycyB0aGF0IGFyZSBjb25mbGljdFxuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyhlbGVtOiBFbGVtZW50KSB7XG5cbiAgICAgICAgbGV0IGFyaWFBdHRycyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pO1xuICAgICAgICBsZXQgaHRtbEF0dHJzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBpZiAoYXJpYUF0dHJzICYmIGFyaWFBdHRycy5sZW5ndGggPiAwICYmIGh0bWxBdHRycyAmJiBodG1sQXR0cnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0T3JPdmVybGFwcGluZ0h0bWxBdHRyaWJ1dGUoYXJpYUF0dHJzW2ldLCBodG1sQXR0cnMsICdjb25mbGljdCcpO1xuICAgICAgICAgICAgICAgIGlmIChleGFtaW5lZEh0bWxBdHJOYW1lcyA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnRmFpbGVkJykgLy9mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHsgJ2FyaWFBdHRyJzogYXJpYUF0dHJzW2ldWyduYW1lJ10sICdodG1sQXR0cic6IGl0ZW1bJ2F0dHInXSB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGdldCBkZXByZWNhdGVkIEFyaWEgcm9sZXNcbiAgICAgKiByZXR1cm46IGEgbGlzdCBvZiBkZXByZWNhdGVkIEFyaWEgcm9sZXNcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhlbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGdsb2JhbERlcHJlY2F0ZWRSb2xlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUm9sZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbERlcHJlY2F0ZWRSb2xlcy5pbmNsdWRlcyhyb2xlc1tpXSkpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHJvbGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGdldCBkZXByZWNhdGVkIEFyaWEgcm9sZS1hdHRyaWJ1dGVzXG4gICAgICogcmV0dXJuOiBhIGxpc3Qgb2YgZGVwcmVjYXRlZCBBcmlhIHJvbGUtYXR0cmlidXRlcyBwYXJpc1xuICAgICAqICAgICAgICAgZm9yIGdsb2JhbCB0aGUgcm9sZSBpcyBtYXJrZWQgYXMgJ2FueSdcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJpYUF0dHJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZ2xvYmFsRGVwcmVjYXRlZFByb3BlcnRpZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZEF0dHJpYnV0ZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2ldKSlcbiAgICAgICAgICAgICAgICByZXQucHVzaCh7IFwicm9sZVwiOiBcImFueVwiLCBcImF0dHJpYnV0ZVwiOiBhcmlhQXR0cnNbaV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhlbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZVdpdGhEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpTmFtZXMgPSByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzWydkZXByZWNhdGVkUHJvcHMnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaU5hbWVzICYmIGRlcHJlY2F0ZWRBdHRyaU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXJpYUF0dHJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaU5hbWVzLmluY2x1ZGVzKGFyaWFBdHRyc1tqXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHsgXCJyb2xlXCI6IHJvbGVzW2ldLCBcImF0dHJpYnV0ZVwiOiBhcmlhQXR0cnNbal0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUluR3JpZChub2RlKSB7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKG5vZGUsIFwiZ3JpZFwiKSAhPSBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQm91bmRzIH0gZnJvbSBcIi4uL2FwaS9JQm91bmRzXCI7XG5cbnR5cGUgUHNldWRvQ2xhc3MgPVxuICAgIHwgXCI6aG92ZXJcIlxuICAgIHwgXCI6YWN0aXZlXCJcbiAgICB8IFwiOmZvY3VzXCJcbiAgICB8IFwiOmZvY3VzLXZpc2libGVcIlxuICAgIHwgXCI6Zm9jdXMtd2l0aGluXCI7XG5cbmV4cG9ydCBjbGFzcyBDU1NVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIHNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rvci50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5tYXRjaGVzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTmF0aXZlIGZ1bmN0aW9ucyBub3QgdGhlcmUsIGZhbGxiYWNrXG4gICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IChcbiAgICAgICAgICAgICAgICBlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQub3duZXJEb2N1bWVudFxuICAgICAgICAgICAgKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIGxldCBpID0gMDtcblxuICAgICAgICAgICAgd2hpbGUgKGkgPCBtYXRjaGVzLmxlbmd0aCAmJiBtYXRjaGVzW2ldICE9PSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gaSA8IG1hdGNoZXMubGVuZ3RoO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIEJhZCBzZWxlY3Rvcj8gRG9lc24ndCBtYXRjaCB0aGVuLi4uXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBjb21wdXRlZCBmb3IgdGhpcyBlbGVtZW50XG4gICAgICogQHBhcmFtIGVsZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbXB1dGVkU3R5bGUoZWxlbTogSFRNTEVsZW1lbnQsIHBzZXVkb0VsdD86IFBzZXVkb0NsYXNzKSB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcbiAgICAgICAgY29uc3Qgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICByZXR1cm4gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSwgcHNldWRvRWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBjb21wdXRlZCBzdHlsZSBpbiB0aGF0IHRoZSBjb21wdXRlZCBzdHlsZSB3aWxsIHJldHVyblxuICAgICAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gICAgICogYXBwbGljYXRpb25cbiAgICAgKiBpZiByb3RhdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZCwgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgdGhlIHJlc29sdmVkIG1hdHJpeFxuICAgICAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKVxuICAgICAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKSdcbiAgICAgKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJ1xuICAgICAqXG4gICAgICogY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgcHNldWRvQ2xhc3MgZnJvbSBQc2V1ZG9DbGFzcyB0byBzdHJpbmcgdG8gaW5jbHVkZSBib3RoIHBzZXVkbyBjbGFzc2VzIChlLmcuLCA6Zm9jdXMsIDpjaGVja2VkKVxuICAgICAqIGFuZCBwc2V1ZG8gZWxlbWVudHMgKGUuZy4sIDo6YmVmb3JlLCA6OmFmdGVyKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAgICAgKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvQ2xhc3M/OiBzdHJpbmcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJGdW5jdGlvbjogZ2V0RGVmaW5lZFN0eWxlc1wiKTtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZGVmaW5lZFN0eWxlcyA9IHt9O1xuICAgICAgICBsZXQgZGVmaW5lZFN0eWxlUHNldWRvID0ge307XG5cbiAgICAgICAgZnVuY3Rpb24gZmlsbFN0eWxlKG1hcHMsIHN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBzdHlsZS5sZW5ndGg7ICsrc0luZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlW3NJbmRleF0gPT09IFwiYWxsXCIgJiYgc3R5bGVbc3R5bGVbc0luZGV4XV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHN0eWxlW3NJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IHN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gbWFwICYmIG1hcFtrZXldLmVuZHNXaXRoKFwiIWltcG9ydGFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPT09IFwiaW1wb3J0YW50XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1hcFtrZXldLnN0YXJ0c1dpdGgoXCJpbmhlcml0XCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3ZlcnJpZGUgIWltcG9ydGFudCBvbmx5IGlmIGl0IGlzIGFsc28gIWltcG9ydGFudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSAhaW1wb3J0YW50IGlmIGl0IGlzIG5vdCAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY3JlYXRlL292ZXJpZGUgYW55d2F5XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVtrZXldICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByaW9yaXR5ID09PSBcImltcG9ydGFudFwiID8gXCIgIWltcG9ydGFudFwiIDogXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RvcmVkU3R5bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIXBzZXVkb0NsYXNzICYmIHN0b3JlZFN0eWxlcykge1xuICAgICAgICAgICAgZGVmaW5lZFN0eWxlcyA9IHN0b3JlZFN0eWxlc1tcImRlZmluZWRTdHlsZXNcIl07XG4gICAgICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG8gPSBzdG9yZWRTdHlsZXNbXCJkZWZpbmVkU3R5bGVQc2V1ZG9cIl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBzdHlsZXNoZWV0cyBhbmQgcnVsZXNcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgbGV0IHNzSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHNzSW5kZXggPCBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICsrc3NJbmRleFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbXG4gICAgICAgICAgICAgICAgICAgIHNzSW5kZXhcbiAgICAgICAgICAgICAgICBdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkdvdCBzaGVldFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgckluZGV4IDwgc2hlZXQuY3NzUnVsZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrckluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkdvdCBydWxlOiBcIiwgc2hlZXQuY3NzUnVsZXNbckluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFJ1bGVTZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2V1ZG9NYXRjaCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9eKC4qKSg6W2EtekEtWi1dKikkL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsTWFpbiA9IGhhc1BzZXVkb0NsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBzZXVkb01hdGNoWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZ1bGxSdWxlU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbFBzZXVkbyA9IGhhc1BzZXVkb0NsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBzZXVkb01hdGNoWzJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhbWVQc2V1ZG9DbGFzcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxQc2V1ZG8gPT09IHBzZXVkb0NsYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgJiYgcHNldWRvQ2xhc3MgPT09IFwiOmZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMsIHJlbW92ZSBmb2N1cy13aXRoaW4gZnJvbSBwYXJlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxNYWluID0gc2VsTWFpbi5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8oWyA+XVteK34gPl0rKTpmb2N1cy13aXRoaW4vZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiQxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgc3R5bGVzIG9mIG5vbi1wc2V1ZG8gc2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNQc2V1ZG9DbGFzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NTVXRpbC5zZWxlY3Rvck1hdGNoZXNFbGVtKGVsZW0sIHNlbE1haW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFN0eWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZpbmVkU3R5bGVzLCBkZWZpbmVkU3R5bGVQc2V1ZG9dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUuc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lUHNldWRvQ2xhc3MgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTU1V0aWwuc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtLCBzZWxNYWluKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZShbZGVmaW5lZFN0eWxlUHNldWRvXSwgcnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiU2VjdXJpdHlFcnJvcjpcIilcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL1xuXG4gICAgICAgICAgICAvLyBIYW5kbGVkIHRoZSBzdHlsZXNoZWV0cywgbm93IGhhbmRsZSB0aGUgZWxlbWVudCBkZWZpbmVkIHN0eWxlc1xuICAgICAgICAgICAgZmlsbFN0eWxlKFtkZWZpbmVkU3R5bGVzLCBkZWZpbmVkU3R5bGVQc2V1ZG9dLCBlbGVtLnN0eWxlKTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCB7XG4gICAgICAgICAgICAgICAgZGVmaW5lZFN0eWxlcyxcbiAgICAgICAgICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgKiAnaW5pdGlhbCcgc2V0cyB0aGUgc3R5bGUgYmFjayB0byBkZWZhdWx0XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGVmaW5lZFN0eWxlcykge1xuICAgICAgICBpZiAoZGVmaW5lZFN0eWxlc1trZXldID09PSBcImluaXRpYWxcIikge1xuICAgICAgICAgICAgZGVsZXRlIGRlZmluZWRTdHlsZXNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkZWZpbmVkU3R5bGVQc2V1ZG8pIHtcbiAgICAgICAgaWYgKGRlZmluZWRTdHlsZVBzZXVkb1trZXldID09PSBcImluaXRpYWxcIikge1xuICAgICAgICAgICAgZGVsZXRlIGRlZmluZWRTdHlsZVBzZXVkb1trZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgICovXG5cbiAgICAgICAgaWYgKCFwc2V1ZG9DbGFzcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbREVCVUc6IENTU1V0aWw6OmdldERlZmluZWRTdHlsZXNdXCIsIGVsZW0ubm9kZU5hbWUsIHBzZXVkb0NsYXNzLCBKU09OLnN0cmluZ2lmeShkZWZpbmVkU3R5bGVzLCBudWxsLCAyKSk7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lZFN0eWxlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRlZmluZWRTdHlsZVBzZXVkbykge1xuICAgICAgICAgICAgICAgIGlmIChkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XSA9PT0gZGVmaW5lZFN0eWxlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltERUJVRzogQ1NTVXRpbDo6Z2V0RGVmaW5lZFN0eWxlc11cIiwgZWxlbS5ub2RlTmFtZSwgcHNldWRvQ2xhc3MsIEpTT04uc3RyaW5naWZ5KGRlZmluZWRTdHlsZVBzZXVkbywgbnVsbCwgMikpO1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZWRTdHlsZVBzZXVkbztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1lZGlhIHF1ZXJ5IGRlZmluZWQgZm9yIHRoZSBkb2N1bWVudFxuICAgICAqIFxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7RG9jdW1lbnR9IGRvYyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE1lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm0oZG9jOiBEb2N1bWVudCkge1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0ge31cblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBzdHlsZXNoZWV0cyBhbmQgcnVsZXNcbiAgICAgICAgZm9yIChsZXQgc3NJbmRleCA9IDA7IHNzSW5kZXggPCBkb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gZG9jLnN0eWxlU2hlZXRzW3NzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5jc3NSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBzaGVldC5jc3NSdWxlcy5sZW5ndGg7ICsrckluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGVldFJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovID09PSBzaGVldFJ1bGUuTUVESUFfUlVMRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldFJ1bGUgYXMgQ1NTTWVkaWFSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlICYmIHJ1bGUubWVkaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWFMaXN0ID0gcnVsZS5tZWRpYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZWRpYUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWVkaWFMaXN0Lml0ZW0oaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1fdHJhbnNmb3JtcyA9IG9yaWVudGF0aW9uVHJhbnNmb3Jtc1ttZWRpYUxpc3QuaXRlbShpKS50b0xvY2FsZUxvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gcnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tpXS5TVFlMRV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbaV0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHN0eWxlUnVsZS5zZWxlY3RvclRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHN0eWxlUnVsZS5zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc3R5bGVzLmxlbmd0aDsgKytzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBcImFsbFwiICYmIHN0eWxlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdHJhbnNmb3Jtc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1zW2tleV0gPSBzdHlsZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwicm90YXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1fdHJhbnNmb3Jtc1tzZWxlY3Rvcl0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUxpc3QuaXRlbShpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhTGlzdC5pdGVtKGkpLnRvTG9jYWxlTG93ZXJDYXNlKCldID0gZWxlbV90cmFuc2Zvcm1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yaWVudGF0aW9uVHJhbnNmb3JtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb252ZXJ0IGdpdmVuIHJvdGF0aW9uIHRyYW5zZm9ybSBmdW5jdGlvbnMgdG8gdGhlIGRlZ3JlZSB0cmFuc2Zvcm1lZC5cbiAgICAgKiBJZiBtdWx0aXBsZSBmdW5jdGlvbnMgYXJlIGdpdmVuLCB0aGVuIHRoZSBmdW5jdGlvbnMgYXJlIGFwcGxpZWQgbGluZWFybHkgaW4gdGhlIG9yZGVyLlxuICAgICAqICAgcm90YXRpb25fdHJhbnNmb3JtIGZ1bmN0aW9uIGV4YW1wbGU6ICByb3RhdGUoNDVkZWcpLCByb3RhdGUoMnR1cm4pLCByb3RhdGUoMnJhZCksIHJvdGF0ZTNkKDEsIDEsIDEsIDQ1ZGVnKSxcbiAgICAgKiAgICAgICAgcm90YXRlKDJyYWQpIHJvdGF0ZTNkKDEsIDEsIDEsIDQ1ZGVnKVxuICAgICAqIEBwYXJhbSByb3RhdGlvbl90cmFuc2Zvcm1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvdGF0aW9uRGVncmVlKHJvdGF0aW9uX3RyYW5zZm9ybSkge1xuICAgICAgICBsZXQgZGVncmVlID0gMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghcm90YXRpb25fdHJhbnNmb3JtKSByZXR1cm4gZGVncmVlO1xuICAgICAgICAgICAgLy8gbm9ybWFsaXplIHRoZSByb3RhdGlvbl90cmFuc2Zvcm1cbiAgICAgICAgICAgIHJvdGF0aW9uX3RyYW5zZm9ybSA9IHJvdGF0aW9uX3RyYW5zZm9ybS5yZXBsYWNlQWxsKFwiLCBcIiwgXCIsXCIpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX2Z1bmN0aW9ucyA9IHJvdGF0aW9uX3RyYW5zZm9ybS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybV9mdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1fZnVuY3Rpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb25zW2ldLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uID09PSBcIlwiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGUzZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdGF0aW9uID0gdmFsdWVzWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm90YXRpb24pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uID0gcm90YXRpb24udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInJhZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IChudW0gKiAxODApIC8gTWF0aC5QSTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwiZGVnXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlICs9IG51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcInJvdGF0ZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcInJvdGF0ZVpcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogcm90YXRlKDQ1ZGVnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uID0gcm90YXRpb24udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwidHVyblwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IG51bSAqIDM2MDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSAobnVtICogMTgwKSAvIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwiZGVnXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlICs9IG51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJtYXRyaXgzZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRocmVlIEV1bGVyIGFuZ2xlc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdHJpeCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHZhbHVlcyA9IG1hdHJpeC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgel9hbmdsZSA9IE1hdGguYXRhbjIodmFsdWVzWzRdLCB2YWx1ZXNbNV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JlZSArPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKCh6X2FuZ2xlICogMTgwKSAvIE1hdGguUEkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJtYXRyaXhcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aHJlZSBFdWxlciBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1sxXSwgdmFsdWVzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWUgKz0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoel9hbmdsZSAqIDE4MCkgLyBNYXRoLlBJKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChkZWdyZWUgPj0gMzYwKSBkZWdyZWUgLT0gMzYwO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ2Fubm90IHJldHJpZXZlIHJvdGF0aW9uIGRlZ3JlZTogXCIgKyBlcnIpO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWdyZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBDU1Mgc3R5bGUgc3RyaW5nIHZhbHVlcyB0byBwaXhlbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgc3R5bGUgdmFsdWUgaW4gc3RyaW5nLCBzdWNoIGFzIDNyZW0sIDIzMHB4IGV0Yy5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogQHJldHVybiB2YWx1ZSBpbiBwaXhlbHNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFBpeGVsc0Zyb21TdHlsZSh2YWx1ZSwgZWxlbSkge1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgcmVnZXggPSAvKC0/W1xcZC5dKykoW2EteiVdKikvO1xuICAgICAgICBsZXQgcGFyc2VkID0gdmFsdWUudHJpbSgpLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgICAgIGlmIChwYXJzZWRbMl0gPT09IFwiXCIgfHwgcGFyc2VkWzFdID09PSAwKVxuICAgICAgICAgICAgLy9ubyB6ZXJvIHZhbHVlIHdpdGhvdXQgdW5pdCB3aGljaCBpcyBjb25zaWRlcmVkIGFzIGVycm9yLCBzbyBpbXBsaWNhYmxlXG4gICAgICAgICAgICByZXR1cm4gMDtcblxuICAgICAgICBjb25zdCBwaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFyc2VkWzJdLCBwYXJzZWRbMV0sIGVsZW0pO1xuICAgICAgICByZXR1cm4gcGl4ZWxzID09PSBudWxsID8gcGl4ZWxzIDogcGFyc2VGbG9hdChwaXhlbHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYWJzb2x1dGUgQ1NTIG51bWVyaWNhbCB2YWx1ZXMgdG8gcGl4ZWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVuaXRWYWx1ZSBpbiBzdHJpbmdcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IGVsZW1lbnQuXG4gICAgICogQHJldHVybiB2YWx1ZSBpbiBwaXhlbHNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdCwgdW5pdFZhbHVlLCBlbGVtKSB7XG4gICAgICAgIGlmICh1bml0VmFsdWUgPT0gMCkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZFVuaXRzID0ge1xuICAgICAgICAgICAgLy8gYWJzb2x1dGUgdW5pdFxuICAgICAgICAgICAgcHg6ICh2YWx1ZSkgPT4gdmFsdWUsXG4gICAgICAgICAgICBjbTogKHZhbHVlKSA9PiB2YWx1ZSAqIDM3LjgsXG4gICAgICAgICAgICBtbTogKHZhbHVlKSA9PiB2YWx1ZSAqIDMuNzgsXG4gICAgICAgICAgICBxOiAodmFsdWUpID0+IHZhbHVlICogMC45NSxcbiAgICAgICAgICAgIGluOiAodmFsdWUpID0+IHZhbHVlICogOTYsXG4gICAgICAgICAgICBwYzogKHZhbHVlKSA9PiB2YWx1ZSAqIDE2LFxuICAgICAgICAgICAgcHQ6ICh2YWx1ZSkgPT4gdmFsdWUgKiAxLjMzLFxuXG4gICAgICAgICAgICAvLyByZWxhdGl2ZSB1bml0XG4gICAgICAgICAgICByZW06ICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICB2YWx1ZSAqXG4gICAgICAgICAgICAgICAgcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgKS5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9udC1zaXplXCIpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGVtOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgdmFsdWUgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB2dzogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKiBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJXaWR0aCxcbiAgICAgICAgICAgIHZoOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgKHZhbHVlIC8gMTAwKSAqIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lckhlaWdodCxcbiAgICAgICAgICAgIFwiJVwiOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgKHZhbHVlIC8gMTAwKSAqXG4gICAgICAgICAgICAgICAgcGFyc2VGbG9hdChcbiAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKS5nZXRQcm9wZXJ0eVZhbHVlKFwiZm9udC1zaXplXCIpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodW5pdCBpbiBzdXBwb3J0ZWRVbml0cykgcmV0dXJuIHN1cHBvcnRlZFVuaXRzW3VuaXRdKHVuaXRWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qXG4gICAgICogUmV0dXJucyBpZiB0aGUgZm9udCBmb3IgdmlzaWJsZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGlzIGRlZmluZWQgYnkgbWF0ZXJpYWwgaWNvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgZXhpc3RlbmNlIG1hdGVyaWFsIGljb25zIHVzaW5nIGZldGNoIGluIG5vZGUgMTgrXG4gICAgICAgIC8vIGZvciBub3cgKG5vZGUgMTYpIGp1c3QgZGVydGVybWluZSBpZiB0aGUgc3R5bGVzaGVldCBmb3IgdGhlICdNYXRlcmlhbCBJY29ucycgZXhpc3RzIHN0YXRpY2FsbHkuIG5vdGUgdGhhdCB0aGUgbG9hZGluZyBvZiB0aGUgZm9udCBzdHlsZXNoZWV0IG9jY3VycyBhdCBydW4gdGltZS5cbiAgICAgICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICAgICAgY29uc3Qga25vd25faWNvbnMgPSB7XG4gICAgICAgICAgICBcIk1hdGVyaWFsIEljb25zXCI6XG4gICAgICAgICAgICAgICAgXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGtub3duX2Nzc19jbGFzc2VzID0ge1xuICAgICAgICAgICAgXCJtYXRlcmlhbC1pY29uc1wiOlxuICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgIGxldCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbSk7XG4gICAgICAgIGxldCBmb250RmFtaWx5ID0gc3R5bGVzW1wiZm9udC1mYW1pbHlcIl07XG5cbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIC8vIGZvbnQtZmFtaWx5IHNwZWNpZmllcyBhIHByaW9yaXRpemVkIGxpc3Qgb2Ygb25lIG9yIG1vcmUgZm9udCBmYW1pbHkgbmFtZXNcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZm9udEZhbWlseSAmJlxuICAgICAgICAgICAgZm9udEZhbWlseS5zcGxpdChcIixcIilbMF0ucmVwbGFjZSgvWydcIl0rL2csIFwiXCIpLnRyaW0oKSBpbiBrbm93bl9pY29uc1xuICAgICAgICApXG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgbGV0IGxpc3QgPSBlbGVtLmNsYXNzTGlzdDtcbiAgICAgICAgICAgIGZvciAobGV0IGNzc19jbGFzcyBpbiBrbm93bl9jc3NfY2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIGlmIChsaXN0LmNvbnRhaW5zKGNzc19jbGFzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3VuZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHN0eWxlc2hlZXQgZm9yIHRoZSAnTWF0ZXJpYWwgSWNvbnMnIGV4aXN0cyBzdGF0aWNhbGx5XG4gICAgICAgIGxldCBzaGVldHMgPSBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHM7XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc2hlZXRzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc2hlZXRzICYmXG4gICAgICAgICAgICAgICAgc2hlZXRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGtub3duX2ljb25zKS5pbmRleE9mKHNoZWV0c1tzXS5ocmVmKSA+IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRXZWlnaHROdW1iZXIoc3R5bGVWYWwpIHtcbiAgICAgICAgbGV0IG1hcCA9IHtcbiAgICAgICAgICAgIGxpZ2h0OiAxMDAsXG4gICAgICAgICAgICBib2xkOiA3MDAsXG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXRWYWwgPSBwYXJzZUludChzdHlsZVZhbCk7XG4gICAgICAgIGlmIChyZXRWYWwpIHJldHVybiByZXRWYWw7XG4gICAgICAgIGlmIChzdHlsZVZhbCBpbiBtYXApIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgICAgICByZXR1cm4gNDAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Rm9udEluUGl4ZWxzKHN0eWxlVmFsLCBlbGVtKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBcInh4LXNtYWxsXCI6IDE2LFxuICAgICAgICAgICAgXCJ4LXNtYWxsXCI6IDEwLFxuICAgICAgICAgICAgc21hbGw6IDEzLFxuICAgICAgICAgICAgbWVkaXVtOiAxNixcbiAgICAgICAgICAgIGxhcmdlOiAxOCxcbiAgICAgICAgICAgIFwieC1sYXJnZVwiOiAyNCxcbiAgICAgICAgICAgIFwieHgtbGFyZ2VcIjogMzIsXG4gICAgICAgIH07XG4gICAgICAgIGxldCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3R5bGVWYWwpO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwW3N0eWxlVmFsXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdW5pdHMgPSBzdHlsZVZhbC5zdWJzdHJpbmcoKFwiXCIgKyB2YWx1ZSkubGVuZ3RoKTtcbiAgICAgICAgLyoqXG4gICAgICAgIGlmICh1bml0cyA9PT0gXCJcIiB8fCB1bml0cyA9PT0gXCJweFwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCJlbVwiKSByZXR1cm4gdmFsdWUgKiAxNjtcbiAgICAgICAgaWYgKHVuaXRzID09PSBcIiVcIikgcmV0dXJuIHZhbHVlIC8gMTAwICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCJwdFwiKSByZXR1cm4gdmFsdWUgKiA0IC8gMztcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUpO1xuICAgICovXG4gICAgICAgIHJldHVybiBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdHMsIHZhbHVlLCBlbGVtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldENTU1N0eWxlKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICAgIGlmIChlbGVtZW50LklCTV9DU1NfVEhCKSByZXR1cm4gZWxlbWVudC5JQk1fQ1NTX1RIQjtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAoc3R5bGVUZXh0ID09PSB1bmRlZmluZWQgfHwgc3R5bGVUZXh0LnRyaW0oKSA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gW107XG4gICAgICAgIGlmIChzdHlsZVRleHQgPT09IG51bGwgfHwgc3R5bGVUZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAgICAgLy9yZW1vdmUgY29tbWVudCBibG9ja3NcbiAgICAgICAgbGV0IHJlID0gLyhcXC9cXCorKD86KD86KD86W15cXCpdKSspfCg/OltcXCpdKyg/IVxcLykpKVsqXStcXC8pfFxcL1xcLy4qL2c7XG4gICAgICAgIGxldCBzdWJzdCA9IFwiIFwiO1xuICAgICAgICBzdHlsZVRleHQgPSBzdHlsZVRleHQucmVwbGFjZShyZSwgc3Vic3QpO1xuICAgICAgICAvLyBGaW5kIGFsbCBcImtleSA6IHZhbDtcIiBwYWlycyB3aXRoIHZhcmlvdXMgd2hpdGVzcGFjZSBpbmJldHdlZW5cbiAgICAgICAgbGV0IHJLZXlWYWxzID0gL1xccyooW146XFxzXSspXFxzKjpcXHMqKFteOyR9XSspXFxzKig7fCQpL2c7XG4gICAgICAgIC8vIEZpbmQgYWxsIFwic2VsZWN0b3IgeyBjc3NrZXl2YWxzIH0gd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByU2VsZWN0b3JzID0gL1xccyooW157XSopeyhbXn1dKil9L2c7XG4gICAgICAgIGlmIChzdHlsZVRleHQuaW5kZXhPZihcIntcIikgPT09IC0xKSB7XG4gICAgICAgICAgICBsZXQga2V5VmFscyA9IHt9O1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByS2V5VmFscy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBrZXlWYWxzW21bMV1dID0gbVsyXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gW107XG4gICAgICAgICAgICBsZXQgbTtcbiAgICAgICAgICAgIGxldCBtMjtcbiAgICAgICAgICAgIHdoaWxlICgobSA9IHJTZWxlY3RvcnMuZXhlYyhzdHlsZVRleHQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsS2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsVmFsID0gbVsyXTtcblxuICAgICAgICAgICAgICAgIHdoaWxlICgobTIgPSByS2V5VmFscy5leGVjKHNlbFZhbCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5VmFsc1ttMlsxXV0gPSBtMlsyXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsS2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGtleVZhbHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50LklCTV9DU1NfVEhCID0gcmV0VmFsO1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGFuIFwiaW5saW5lXCIgQ1NTIGRpc3BsYXkgcHJvcGVydHkgdGVsbHMgdGhlIGVsZW1lbnQgdG8gZml0IGl0c2VsZiBvbiB0aGUgc2FtZSBsaW5lLiBBbiAnaW5saW5lJyBlbGVtZW50J3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgaWdub3JlZC5cbiAgICAgKiBzb21lIGVsZW1lbnQgaGFzIGRlZmF1bHQgaW5saW5lIHByb3BlcnR5LCBzdWNoIGFzIDxzcGFuPiwgPGE+XG4gICAgICogbW9zdCBmb3JtYXR0aW5nIGVsZW1lbnRzIGluaGVyZW50IGlubGluZSBwcm9wZXJ0eSwgc3VjaCBhcyA8ZW0+LCA8c3Ryb25nPiwgPGk+LCA8c21hbGw+XG4gICAgICogb3RoZXIgaW5saW5lIGVsZW1lbnRzOiA8YWJicj4gPGFjcm9ueW0+IDxiPiA8YmRvPiA8YmlnPiA8YnI+IDxjaXRlPiA8Y29kZT4gPGRmbj4gPGVtPiA8aT4gPGlucHV0PiA8a2JkPiA8bGFiZWw+XG4gICAgICogPG1hcD4gPG9iamVjdD4gPG91dHB1dD4gPHE+IDxzYW1wPiA8c2NyaXB0PiA8c2VsZWN0PiA8c21hbGw+IDxzcGFuPiA8c3Ryb25nPiA8c3ViPiA8c3VwPiA8dGV4dGFyZWE+IDx0aW1lPiA8dHQ+IDx2YXI+XG4gICAgICogYW4gXCJpbmxpbmUtYmxvY2tcIiBlbGVtZW50IHN0aWxsIHBsYWNlIGVsZW1lbnQgaW4gdGhlIHNhbWUgbGluZSB3aXRob3V0IGJyZWFraW5nIHRoZSBsaW5lLCBidXQgdGhlIGVsZW1lbnQncyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhcHBsaWVkLlxuICAgICAqIGlubGluZS1ibG9jayBlbGVtZW50czogaW1nLCBidXR0b24sIHNlbGVjdCwgbWV0ZXIsIHByb2dyZXNzLCBtYXJndWVlLCBhbHNvIGluIENocm9tZTogdGV4dGFyZWEsIGlucHV0XG4gICAgICogQSBibG9jay1sZXZlbCBlbGVtZW50IGFsd2F5cyBzdGFydHMgb24gYSBuZXcgbGluZSwgYW5kIHRoZSBicm93c2VycyBhdXRvbWF0aWNhbGx5IGFkZCBzb21lIHNwYWNlIChhIG1hcmdpbikgYmVmb3JlIGFuZCBhZnRlciB0aGUgZWxlbWVudC5cbiAgICAgKiBibG9jay1sZXZlbCBlbGVtZW50czogPGFkZHJlc3M+IDxhcnRpY2xlPiA8YXNpZGU+IDxibG9ja3F1b3RlPiA8Y2FudmFzPiA8ZGQ+IDxkaXY+IDxkbD4gPGR0PiA8ZmllbGRzZXQ+IDxmaWdjYXB0aW9uPiA8ZmlndXJlPiA8Zm9vdGVyPiA8Zm9ybT5cbiAgICAgKiA8aDE+LTxoNj4gPGhlYWRlcj4gPGhyPiA8bGk+IDxtYWluPiA8bmF2PiA8bm9zY3JpcHQ+IDxvbD4gPHA+IDxwcmU+IDxzZWN0aW9uPiA8dGFibGU+IDx0Zm9vdD4gPHVsPiA8dmlkZW8+XG4gICAgICpcbiAgICAgKiByZXR1cm46IGlmIGl0J3MgaW5saW5lIGVsZW1lbnQgYW5kIHsgaW5saW5lOiB0cnVlIHwgZmFsc2UsIHRleHQ6IHRydWUgfCBmYWxzZSwgdmlvbGF0aW9uOiBudWxsIHwge25vZGV9IH1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldElubGluZVN0YXR1cyhlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZWxlbV9zdHlsID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICAgICAgaWYgKCFlbGVtX3N0eWwpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBzdGF0dXMgPSB7IGlubGluZTogZmFsc2UsIHRleHQ6IGZhbHNlLCB2aW9sYXRpb246IG51bGwgfTtcbiAgICAgICAgY29uc3QgdWRpc3BsYXkgPSBlbGVtX3N0eWwuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgIC8vIGlubGluZSBlbGVtZW50IG9ubHlcbiAgICAgICAgaWYgKHVkaXNwbGF5ICE9PSBcImlubGluZVwiKSByZXR1cm4gc3RhdHVzO1xuXG4gICAgICAgIHN0YXR1cy5pbmxpbmUgPSB0cnVlO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmICghcGFyZW50KSByZXR1cm4gc3RhdHVzO1xuXG4gICAgICAgIGNvbnN0IG1hcHBlcjogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhlbGVtZW50KTtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTtcbiAgICAgICAgLy8gYW4gaW5saW5lIGVsZW1lbnQgaXMgaW5zaWRlIGEgYmxvY2suIG5vdGUgPGJvZHk+IGlzIGEgYmxvY2sgZWxlbWVudCB0b29cbiAgICAgICAgaWYgKGRpc3BsYXkgIT09IFwiYmxvY2tcIiAmJiBkaXNwbGF5ICE9PSBcImlubGluZS1ibG9ja1wiKSB7XG4gICAgICAgICAgICAvL3BhcmVudCBpcyBpbmxpbmUgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzSW5uZXJUZXh0T25seUVtcHR5KHBhcmVudCkpXG4gICAgICAgICAgICAgICAgc3RhdHVzLnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJucyBcInllc1wiXCI6IGlubGluZSB3aXRoIHRleHQsIFwibm9cIjogaW5saW5lIHdpdGhvdXQgdGV4dCwgXG4gICAgICAgICAqICAgICAgICAgIFwidmlvbGF0aW9uXCI6IG5vdCBzcGFjaW5nIGVub3VnaCB0byBuZWlib3JpbmcgaW5saW5lIHRhcmdldFxuICAgICAgICAgKiAgICAgICAgICBcImJsb2NrXCI6IGJsb2NrIGVsZW1lbnQsICBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGlzSW5saW5lV2l0aFRleHQobm9kZTogTm9kZSwgYmVmb3JlOiBib29sZWFuKSA6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAgICAgLy8gbm90ZSBicm93c2VycyBpbnNlcnQgVGV4dCBub2RlcyB0byByZXByZXNlbnQgd2hpdGVzcGFjZXMuXG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlVmFsdWUgJiYgbm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInllc1wiO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibm9cIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IDxicj4gaXMgc3R5bGVkICdpbmxpbmUnIGJ5IGRlZmF1bHQsIGJ1dCBjaGFuZ2UgdGhlIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImJyXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IGNTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjRGlzcGxheSA9IGNTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoY0Rpc3BsYXkgPT09IFwiaW5saW5lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYXJnZXQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib3VuZHMud2lkdGggPCAyNCkgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgaG9yaXpvbnRhbCBzcGFjaW5nIGlzIHN1ZmZpY2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChiZWZvcmUgJiYgKE1hdGgucm91bmQoYm91bmRzLndpZHRoIC8gMikgKyBib3VuZHMubGVmdCAtIGJuZHMubGVmdCA8IDI0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFiZWZvcmUgJiYgKE1hdGgucm91bmQoYm91bmRzLndpZHRoIC8gMikgKyBib3VuZHMubGVmdCAtIChibmRzLmxlZnQgKyBibmRzLndpZHRoKSA8IDI0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnZpb2xhdGlvbiA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidmlvbGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7ICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNJbm5lclRleHRPbmx5RW1wdHkobm9kZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ5ZXNcIjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibm9cIjtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYmxvY2tcIjtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgcmV0dXJuIFwiYmxvY2tcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFuIGlubGluZSBlbGVtZW50IGlzIGluc2lkZSBhIGJsb2NrLiBub3RlIDxib2R5PiBpcyBhIGJsb2NrIGVsZW1lbnQgdG9vXG4gICAgICAgIC8vIG9uZSBvciBtb3JlIGlubGluZSBlbGVtZW50cyB3aXRoIHRleHQgaW4gdGhlIHNhbWUgbGluZTogPHRhcmdldD4sIHRleHQ8dGFyZ2V0PiwgPHRhcmdldD50ZXh0LCA8aW5saW5lPit0ZXh0PHRhcmdldD4sIDx0YXJnZXQ+PGlubGluZT4rdGV4dCwgdGV4dDx0YXJnZXQ+PGlubGluZT4rXG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgbGV0IGlubGluZVRleHQgPSBpc0lubGluZVdpdGhUZXh0KHdhbGtOb2RlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0ID09PSBcInllc1wiKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlubGluZVRleHQgPT09IFwiYmxvY2tcIikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHdhbGtOb2RlID0gZWxlbWVudC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgbGV0IGlubGluZVRleHQgPSBpc0lubGluZVdpdGhUZXh0KHdhbGtOb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJ5ZXNcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0ID09PSBcImJsb2NrXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYSB0YXJnZXQgaXMgZW4gZWxlbWVudCB0aGF0IGFjY2VwdCBhIHBvaW50ZXIgYWN0aW9uIChjbGljayBvciB0b3VjaClcbiAgICAgKiBhIHRhcmdldCBpcyBhIGJyb3dzZXIgZGVmYXVsdCBpZiBpdCdzIGEgbmF0aXZlIHdpZGdldCAobm8gdXNlciBkZWZpbmVkIHJvbGUpIHdpdGhvdXQgdXNlciBzdHlsZVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNUYXJnZXRCcm93c2VyRGVmYXVsdChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIHVzZXIgZGVmaW5lZCB3aWRnZXRcbiAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhlbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gbm8gdXNlciBzdHlsZSB0byBzcGFjZSBjb250cm9sIHNpemUsIGluY2x1ZGluZyB1c2Ugb2YgZm9udFxuICAgICAgICBjb25zdCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbWVudCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0eWxlc1tcImxpbmUtaGVpZ2h0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJoZWlnaHRcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIndpZHRoXCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJtaW4taGVpZ2h0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJtaW4td2lkdGhcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcImZvbnQtc2l6ZVwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWFyZ2luLXRvcFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWFyZ2luLWJvdHRvbVwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWFyZ2luLWxlZnRcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1yaWdodFwiXVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBzdHJpbmcgY29udGFpbnMgQ0pLIChjaGluZXNlLCBqYXBhbmVzZXMsIG9yIGtvcmVhKVxuICAgICAqIHJldHVybjogYm9vbGVhblxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29udGFpbnNDS0oodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGV4dCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NKS19VbmlmaWVkX0lkZW9ncmFwaHMgIGh0dHBzOi8vYXlha2Euc2huLmhrL2hhbnJlZ2V4L1xuICAgICAgICBsZXQgcmVnZXggPSAvKD86W1xcdTRlMDAtXFx1OWZmZlxcdTM0MDAtXFx1NGRiZl0pKy9nO1xuXG4gICAgICAgIGNvbnN0IHJlcGxhY2VkID0gdGV4dC50cmltKCkucmVwbGFjZShyZWdleCwgXCJcIik7XG4gICAgICAgIGlmIChyZXBsYWNlZC5sZW5ndGggPT09IHRleHQudHJpbSgpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igd2l0aCB0aGUgZ2l2ZW4gc3R5bGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge1tzdHJpbmddfSBzdHlsZVByb3BzIC0gVGhlIHN0eWxlIHByb3BlcnRpZXMgYW5kIHZhbHVlcyBvZiB0aGUgcGFyZW50IHRvIHNlYXJjaCBmb3IuXG4gICAgICogICAgICAgICBzdWNoIGFzIHtcIm92ZXJmbG93XCI6WydhdXRvJywgJ3Njcm9sbCddLCBcIm92ZXJmbG93LXhcIjpbJ2F1dG8nLCAnc2Nyb2xsJ119XG4gICAgICogICAgICAgICAgb3Ige1wib3ZlcmZsb3dcIjpbJyonXSwgXCJvdmVyZmxvdy14XCI6WycqJ119LCBUaGUgJyonIGZvciBhbnkgdmFsdWUgdG8gY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgc3R5bGUgcHJvcC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gZXhjbHVkZWRWYWx1ZXMgLSBzdHlsZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgaWdub3JlZC5cbiAgICAgKiBAcmV0dXJuIHtub2RlfSB3YWxrTm9kZSAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQsIHdoaWNoIGhhcyB0aGUgc3R5bGUgcHJvcGVydGllc1xuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3JXaXRoU3R5bGVzKGVsZW0sIHN0eWxlUHJvcHMsIGV4Y2x1ZGVkVmFsdWVzID0gW10pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtOb2RlLCBcIkFyaWFVdGlsX0FuY2VzdG9yV2l0aFN0eWxlc1wiLCBudWxsKTtcbiAgICAgICAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTtcblxuICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGUgaW4gc3R5bGVQcm9wcykge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHN0eWxlc1tzdHlsZV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCIgXCIpWzBdOyAvL2dldCByaWQgb2YgIWltcG9ydGFudFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1ZGVkVmFsdWVzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUHJvcHNbc3R5bGVdLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUod2Fsa05vZGUsIFwiQXJpYVV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzXCIsIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlUHJvcHNbc3R5bGVdLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZSh3YWxrTm9kZSwgXCJBcmlhVXRpbF9BbmNlc3RvcldpdGhTdHlsZXNcIiwgd2Fsa05vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkFyaWFVdGlsX0FuY2VzdG9yV2l0aFN0eWxlc1wiLCB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlVXRpbCB7XG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAqIHdpdGggaXRzIGluaXRpYWwgdmFsdWUgYXMgZ2l2ZW4gKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdFZhbHVlKSB7XG4gICAgICAgIGlmICghY2FjaGVTcG90KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID0gaW5pdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q2FjaGUoY2FjaGVTcG90OiBEb2N1bWVudCB8IEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgU2hhZG93Um9vdCwgZ2xvYmFsTmFtZSwgdmFsdWUpOiBhbnkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZXMoY2FjaGVSb290OiBOb2RlKTogdm9pZCB7XG4gICAgICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoY2FjaGVSb290LCBmYWxzZSwgY2FjaGVSb290LCB0cnVlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgZGVsZXRlIChudy5ub2RlIGFzIENhY2hlRWxlbWVudCkuYWNlQ2FjaGU7XG4gICAgICAgICAgICBudy5ub2RlLm93bmVyRG9jdW1lbnQgJiYgZGVsZXRlIChudy5ub2RlLm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIH0gd2hpbGUgKG53Lm5leHROb2RlKCkpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb2xvclV0aWwge1xuXG4gICAgcHVibGljIHN0YXRpYyBDU1NDb2xvckxvb2t1cCA9IHtcbiAgICAgICAgXCJhbGljZWJsdWVcIjogXCIjZjBmOGZmXCIsXG4gICAgICAgIFwiYW50aXF1ZXdoaXRlXCI6IFwiI2ZhZWJkN1wiLFxuICAgICAgICBcImFxdWFcIjogXCIjMDBmZmZmXCIsXG4gICAgICAgIFwiYXF1YW1hcmluZVwiOiBcIiM3ZmZmZDRcIixcbiAgICAgICAgXCJhenVyZVwiOiBcIiNmMGZmZmZcIixcbiAgICAgICAgXCJiZWlnZVwiOiBcIiNmNWY1ZGNcIixcbiAgICAgICAgXCJiaXNxdWVcIjogXCIjZmZlNGM0XCIsXG4gICAgICAgIFwiYmxhY2tcIjogXCIjMDAwMDAwXCIsXG4gICAgICAgIFwiYmxhbmNoZWRhbG1vbmRcIjogXCIjZmZlYmNkXCIsXG4gICAgICAgIFwiYmx1ZVwiOiBcIiMwMDAwZmZcIixcbiAgICAgICAgXCJibHVldmlvbGV0XCI6IFwiIzhhMmJlMlwiLFxuICAgICAgICBcImJyb3duXCI6IFwiI2E1MmEyYVwiLFxuICAgICAgICBcImJ1cmx5d29vZFwiOiBcIiNkZWI4ODdcIixcbiAgICAgICAgXCJjYWRldGJsdWVcIjogXCIjNWY5ZWEwXCIsXG4gICAgICAgIFwiY2hhcnRyZXVzZVwiOiBcIiM3ZmZmMDBcIixcbiAgICAgICAgXCJjaG9jb2xhdGVcIjogXCIjZDI2OTFlXCIsXG4gICAgICAgIFwiY29yYWxcIjogXCIjZmY3ZjUwXCIsXG4gICAgICAgIFwiY29ybmZsb3dlcmJsdWVcIjogXCIjNjQ5NWVkXCIsXG4gICAgICAgIFwiY29ybnNpbGtcIjogXCIjZmZmOGRjXCIsXG4gICAgICAgIFwiY3JpbXNvblwiOiBcIiNkYzE0M2NcIixcbiAgICAgICAgXCJjeWFuXCI6IFwiIzAwZmZmZlwiLFxuICAgICAgICBcImRhcmtibHVlXCI6IFwiIzAwMDA4YlwiLFxuICAgICAgICBcImRhcmtjeWFuXCI6IFwiIzAwOGI4YlwiLFxuICAgICAgICBcImRhcmtnb2xkZW5yb2RcIjogXCIjYjg4NjBiXCIsXG4gICAgICAgIFwiZGFya2dyYXlcIjogXCIjYTlhOWE5XCIsXG4gICAgICAgIFwiZGFya2dyZWVuXCI6IFwiIzAwNjQwMFwiLFxuICAgICAgICBcImRhcmtraGFraVwiOiBcIiNiZGI3NmJcIixcbiAgICAgICAgXCJkYXJrbWFnZW50YVwiOiBcIiM4YjAwOGJcIixcbiAgICAgICAgXCJkYXJrb2xpdmVncmVlblwiOiBcIiM1NTZiMmZcIixcbiAgICAgICAgXCJkYXJrb3JhbmdlXCI6IFwiI2ZmOGMwMFwiLFxuICAgICAgICBcImRhcmtvcmNoaWRcIjogXCIjOTkzMmNjXCIsXG4gICAgICAgIFwiZGFya3JlZFwiOiBcIiM4YjAwMDBcIixcbiAgICAgICAgXCJkYXJrc2FsbW9uXCI6IFwiI2U5OTY3YVwiLFxuICAgICAgICBcImRhcmtzZWFncmVlblwiOiBcIiM4ZmJjOGZcIixcbiAgICAgICAgXCJkYXJrc2xhdGVibHVlXCI6IFwiIzQ4M2Q4YlwiLFxuICAgICAgICBcImRhcmtzbGF0ZWdyYXlcIjogXCIjMmY0ZjRmXCIsXG4gICAgICAgIFwiZGFya3R1cnF1b2lzZVwiOiBcIiMwMGNlZDFcIixcbiAgICAgICAgXCJkYXJrdmlvbGV0XCI6IFwiIzk0MDBkM1wiLFxuICAgICAgICBcImRlZXBwaW5rXCI6IFwiI2ZmMTQ5M1wiLFxuICAgICAgICBcImRlZXBza3libHVlXCI6IFwiIzAwYmZmZlwiLFxuICAgICAgICBcImRpbWdyYXlcIjogXCIjNjk2OTY5XCIsXG4gICAgICAgIFwiZG9kZ2VyYmx1ZVwiOiBcIiMxZTkwZmZcIixcbiAgICAgICAgXCJmaXJlYnJpY2tcIjogXCIjYjIyMjIyXCIsXG4gICAgICAgIFwiZmxvcmFsd2hpdGVcIjogXCIjZmZmYWYwXCIsXG4gICAgICAgIFwiZm9yZXN0Z3JlZW5cIjogXCIjMjI4YjIyXCIsXG4gICAgICAgIFwiZnVjaHNpYVwiOiBcIiNmZjAwZmZcIixcbiAgICAgICAgXCJnYWluc2Jvcm9cIjogXCIjZGNkY2RjXCIsXG4gICAgICAgIFwiZ2hvc3R3aGl0ZVwiOiBcIiNmOGY4ZmZcIixcbiAgICAgICAgXCJnb2xkXCI6IFwiI2ZmZDcwMFwiLFxuICAgICAgICBcImdvbGRlbnJvZFwiOiBcIiNkYWE1MjBcIixcbiAgICAgICAgXCJncmF5XCI6IFwiIzgwODA4MFwiLFxuICAgICAgICBcImdyZWVuXCI6IFwiIzAwODAwMFwiLFxuICAgICAgICBcImdyZWVueWVsbG93XCI6IFwiI2FkZmYyZlwiLFxuICAgICAgICBcImhvbmV5ZGV3XCI6IFwiI2YwZmZmMFwiLFxuICAgICAgICBcImhvdHBpbmtcIjogXCIjZmY2OWI0XCIsXG4gICAgICAgIFwiaW5kaWFucmVkXCI6IFwiI2NkNWM1Y1wiLFxuICAgICAgICBcImluZGlnb1wiOiBcIiM0YjAwODJcIixcbiAgICAgICAgXCJpdm9yeVwiOiBcIiNmZmZmZjBcIixcbiAgICAgICAgXCJraGFraVwiOiBcIiNmMGU2OGNcIixcbiAgICAgICAgXCJsYXZlbmRlclwiOiBcIiNlNmU2ZmFcIixcbiAgICAgICAgXCJsYXZlbmRlcmJsdXNoXCI6IFwiI2ZmZjBmNVwiLFxuICAgICAgICBcImxhd25ncmVlblwiOiBcIiM3Y2ZjMDBcIixcbiAgICAgICAgXCJsZW1vbmNoaWZmb25cIjogXCIjZmZmYWNkXCIsXG4gICAgICAgIFwibGlnaHRibHVlXCI6IFwiI2FkZDhlNlwiLFxuICAgICAgICBcImxpZ2h0Y29yYWxcIjogXCIjZjA4MDgwXCIsXG4gICAgICAgIFwibGlnaHRjeWFuXCI6IFwiI2UwZmZmZlwiLFxuICAgICAgICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiI2ZhZmFkMlwiLFxuICAgICAgICBcImxpZ2h0Z3JleVwiOiBcIiNkM2QzZDNcIixcbiAgICAgICAgXCJsaWdodGdyZWVuXCI6IFwiIzkwZWU5MFwiLFxuICAgICAgICBcImxpZ2h0cGlua1wiOiBcIiNmZmI2YzFcIixcbiAgICAgICAgXCJsaWdodHNhbG1vblwiOiBcIiNmZmEwN2FcIixcbiAgICAgICAgXCJsaWdodHNlYWdyZWVuXCI6IFwiIzIwYjJhYVwiLFxuICAgICAgICBcImxpZ2h0c2t5Ymx1ZVwiOiBcIiM4N2NlZmFcIixcbiAgICAgICAgXCJsaWdodHNsYXRlZ3JheVwiOiBcIiM3Nzg4OTlcIixcbiAgICAgICAgXCJsaWdodHN0ZWVsYmx1ZVwiOiBcIiNiMGM0ZGVcIixcbiAgICAgICAgXCJsaWdodHllbGxvd1wiOiBcIiNmZmZmZTBcIixcbiAgICAgICAgXCJsaW1lXCI6IFwiIzAwZmYwMFwiLFxuICAgICAgICBcImxpbWVncmVlblwiOiBcIiMzMmNkMzJcIixcbiAgICAgICAgXCJsaW5lblwiOiBcIiNmYWYwZTZcIixcbiAgICAgICAgXCJtYWdlbnRhXCI6IFwiI2ZmMDBmZlwiLFxuICAgICAgICBcIm1hcm9vblwiOiBcIiM4MDAwMDBcIixcbiAgICAgICAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFwiIzY2Y2RhYVwiLFxuICAgICAgICBcIm1lZGl1bWJsdWVcIjogXCIjMDAwMGNkXCIsXG4gICAgICAgIFwibWVkaXVtb3JjaGlkXCI6IFwiI2JhNTVkM1wiLFxuICAgICAgICBcIm1lZGl1bXB1cnBsZVwiOiBcIiM5MzcwZDhcIixcbiAgICAgICAgXCJtZWRpdW1zZWFncmVlblwiOiBcIiMzY2IzNzFcIixcbiAgICAgICAgXCJtZWRpdW1zbGF0ZWJsdWVcIjogXCIjN2I2OGVlXCIsXG4gICAgICAgIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogXCIjMDBmYTlhXCIsXG4gICAgICAgIFwibWVkaXVtdHVycXVvaXNlXCI6IFwiIzQ4ZDFjY1wiLFxuICAgICAgICBcIm1lZGl1bXZpb2xldHJlZFwiOiBcIiNjNzE1ODVcIixcbiAgICAgICAgXCJtaWRuaWdodGJsdWVcIjogXCIjMTkxOTcwXCIsXG4gICAgICAgIFwibWludGNyZWFtXCI6IFwiI2Y1ZmZmYVwiLFxuICAgICAgICBcIm1pc3R5cm9zZVwiOiBcIiNmZmU0ZTFcIixcbiAgICAgICAgXCJtb2NjYXNpblwiOiBcIiNmZmU0YjVcIixcbiAgICAgICAgXCJuYXZham93aGl0ZVwiOiBcIiNmZmRlYWRcIixcbiAgICAgICAgXCJuYXZ5XCI6IFwiIzAwMDA4MFwiLFxuICAgICAgICBcIm9sZGxhY2VcIjogXCIjZmRmNWU2XCIsXG4gICAgICAgIFwib2xpdmVcIjogXCIjODA4MDAwXCIsXG4gICAgICAgIFwib2xpdmVkcmFiXCI6IFwiIzZiOGUyM1wiLFxuICAgICAgICBcIm9yYW5nZVwiOiBcIiNmZmE1MDBcIixcbiAgICAgICAgXCJvcmFuZ2VyZWRcIjogXCIjZmY0NTAwXCIsXG4gICAgICAgIFwib3JjaGlkXCI6IFwiI2RhNzBkNlwiLFxuICAgICAgICBcInBhbGVnb2xkZW5yb2RcIjogXCIjZWVlOGFhXCIsXG4gICAgICAgIFwicGFsZWdyZWVuXCI6IFwiIzk4ZmI5OFwiLFxuICAgICAgICBcInBhbGV0dXJxdW9pc2VcIjogXCIjYWZlZWVlXCIsXG4gICAgICAgIFwicGFsZXZpb2xldHJlZFwiOiBcIiNkODcwOTNcIixcbiAgICAgICAgXCJwYXBheWF3aGlwXCI6IFwiI2ZmZWZkNVwiLFxuICAgICAgICBcInBlYWNocHVmZlwiOiBcIiNmZmRhYjlcIixcbiAgICAgICAgXCJwZXJ1XCI6IFwiI2NkODUzZlwiLFxuICAgICAgICBcInBpbmtcIjogXCIjZmZjMGNiXCIsXG4gICAgICAgIFwicGx1bVwiOiBcIiNkZGEwZGRcIixcbiAgICAgICAgXCJwb3dkZXJibHVlXCI6IFwiI2IwZTBlNlwiLFxuICAgICAgICBcInB1cnBsZVwiOiBcIiM4MDAwODBcIixcbiAgICAgICAgXCJyZWRcIjogXCIjZmYwMDAwXCIsXG4gICAgICAgIFwicm9zeWJyb3duXCI6IFwiI2JjOGY4ZlwiLFxuICAgICAgICBcInJveWFsYmx1ZVwiOiBcIiM0MTY5ZTFcIixcbiAgICAgICAgXCJzYWRkbGVicm93blwiOiBcIiM4YjQ1MTNcIixcbiAgICAgICAgXCJzYWxtb25cIjogXCIjZmE4MDcyXCIsXG4gICAgICAgIFwic2FuZHlicm93blwiOiBcIiNmNGE0NjBcIixcbiAgICAgICAgXCJzZWFncmVlblwiOiBcIiMyZThiNTdcIixcbiAgICAgICAgXCJzZWFzaGVsbFwiOiBcIiNmZmY1ZWVcIixcbiAgICAgICAgXCJzaWVubmFcIjogXCIjYTA1MjJkXCIsXG4gICAgICAgIFwic2lsdmVyXCI6IFwiI2MwYzBjMFwiLFxuICAgICAgICBcInNreWJsdWVcIjogXCIjODdjZWViXCIsXG4gICAgICAgIFwic2xhdGVibHVlXCI6IFwiIzZhNWFjZFwiLFxuICAgICAgICBcInNsYXRlZ3JheVwiOiBcIiM3MDgwOTBcIixcbiAgICAgICAgXCJzbm93XCI6IFwiI2ZmZmFmYVwiLFxuICAgICAgICBcInNwcmluZ2dyZWVuXCI6IFwiIzAwZmY3ZlwiLFxuICAgICAgICBcInN0ZWVsYmx1ZVwiOiBcIiM0NjgyYjRcIixcbiAgICAgICAgXCJ0YW5cIjogXCIjZDJiNDhjXCIsXG4gICAgICAgIFwidGVhbFwiOiBcIiMwMDgwODBcIixcbiAgICAgICAgXCJ0aGlzdGxlXCI6IFwiI2Q4YmZkOFwiLFxuICAgICAgICBcInRvbWF0b1wiOiBcIiNmZjYzNDdcIixcbiAgICAgICAgXCJ0dXJxdW9pc2VcIjogXCIjNDBlMGQwXCIsXG4gICAgICAgIFwidmlvbGV0XCI6IFwiI2VlODJlZVwiLFxuICAgICAgICBcIndoZWF0XCI6IFwiI2Y1ZGViM1wiLFxuICAgICAgICBcIndoaXRlXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBcIndoaXRlc21va2VcIjogXCIjZjVmNWY1XCIsXG4gICAgICAgIFwieWVsbG93XCI6IFwiI2ZmZmYwMFwiLFxuICAgICAgICBcInllbGxvd2dyZWVuXCI6IFwiIzlhY2QzMlwiLFxuICAgICAgICBcImJ1dHRvbnRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuODQ3KVwiLFxuICAgICAgICBcImJ1dHRvbmZhY2VcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgIFwiZ3JheXRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuMjQ3KVwiXG4gICAgfVxuXG5cbiAgICAvLyBSZXdyaXRlIHRoZSBjb2xvciBvYmplY3QgdG8gYWNjb3VudCBmb3IgYWxwaGFcbiAgICBwdWJsaWMgc3RhdGljIENvbG9yKGNzc1N0eWxlQ29sb3IpIHtcbiAgICAgICAgaWYgKCFjc3NTdHlsZUNvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY3NzU3R5bGVDb2xvciA9IGNzc1N0eWxlQ29sb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIG5ldyBDb2xvck9iaigyNTUsIDI1NSwgMjU1LCAwKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cFtjc3NTdHlsZUNvbG9yXTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKiguKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlZS1kaWdpdCBSR0IgKCNyZ2IpIGlzIGNvbnZlcnRlZCB0byBzaXgtZGlnaXQgZm9ybSAoI3JyZ2diYikgYnkgcmVwbGljYXRpbmcgZGlnaXRzXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItMy8jcmdiLWNvbG9yKVxuICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBcIiNcIiArIGNzc1N0eWxlQ29sb3IuY2hhckF0KDEpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDIpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDMpLnJlcGVhdCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0aGlzUmVkID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMyksIDE2KTtcbiAgICAgICAgICAgIGxldCB0aGlzR3JlZW4gPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSwgMTYpO1xuICAgICAgICAgICAgbGV0IHRoaXNCbHVlID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNyksIDE2KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gICAgcmV0dXJuIG51bGw7IC8vIFVucmVhY2hhYmxlXG4gICAgfTtcblxuIHB1YmxpYyBzdGF0aWMgQ29sb3JDb21ibyhydWxlQ29udGV4dCA6IEhUTUxFbGVtZW50KSB7XG4gICAgdHJ5IHsgXG4gICAgICAgIHZhciBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgaWYgKCF3aW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gcnVsZUNvbnRleHQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlID09PSAxKSBcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnMucHVzaCh3YWxrTm9kZSk7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHJldFZhbCA9IHtcbiAgICAgICAgICAgIFwiaGFzR3JhZGllbnRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImhhc0JHSW1hZ2VcIjogZmFsc2UsXG4gICAgICAgICAgICBcInRleHRTaGFkb3dcIjogZmFsc2UsXG4gICAgICAgICAgICBcImZnXCI6IG51bGwsXG4gICAgICAgICAgICBcImJnXCI6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIHN0YXJ0XG4gICAgICAgIHZhciBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIHZhciBjb21wU3R5bGVDb2xvciA9IGNTdHlsZS5jb2xvcjtcbiAgICAgICAgaWYgKCFjb21wU3R5bGVDb2xvcilcbiAgICAgICAgICAgIGNvbXBTdHlsZUNvbG9yID0gXCJibGFja1wiO1xuICAgICAgICB2YXIgZmcgPSBDb2xvclV0aWwuQ29sb3IoY29tcFN0eWxlQ29sb3IpO1xuICAgICAgICB2YXIgcmVDb2xvciA9IC90cmFuc3BhcmVudHxyZ2JhP1xcKFteKV0rXFwpL2dpO1xuICAgICAgICB2YXIgZ3Vlc3NHcmFkQ29sb3IgPSBmdW5jdGlvbiAoZ3JhZExpc3QsIGJnQ29sb3IsIGZnQ29sb3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjb2xvciwgcmV0dXJuIHRoYXRcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdyYWRMaXN0Lmxlbmd0aCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRMaXN0O1xuXG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdFJhdGlvID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpR3JhZCA9IDE7IGlHcmFkIDwgZ3JhZExpc3QubGVuZ3RoOyArK2lHcmFkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWQgLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGVwID0gLjE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RlcCA+IC4wMDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4ICsgc3RlcCA8PSAxICYmIHdvcnN0UmF0aW8gPiBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggKyBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4ICsgc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8od29yc3RDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaWR4ICsgc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggLSBzdGVwID49IDAgJiYgd29yc3RSYXRpbyA+IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCAtIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggLSBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyh3b3JzdENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggLSBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXAgLyAxMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmFsbFdvcnN0UmF0aW8gPT09IG51bGwgfHwgb3ZlcmFsbFdvcnN0UmF0aW8gPiB3b3JzdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3RSYXRpbyA9IHdvcnN0UmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3QgPSB3b3JzdENvbG9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVyYWxsV29yc3Q7IC8vIHJldHVybiB0aGUgZGFya2VzdCBjb2xvclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJnQ29sb3I7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHByaW9yU3RhY2tCRyA9IENvbG9yVXRpbC5Db2xvcihcIndoaXRlXCIpO1xuICAgICAgICB2YXIgdGhpc1N0YWNrT3BhY2l0eSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tBbHBoYSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgIC8vIEFuY2VzdG9ycyBwcm9jZXNzZWQgZnJvbSB0aGUgdG9wbW9zdCBwYXJlbnQgdG93YXJkIHRoZSBjaGlsZFxuICAgICAgICB3aGlsZSAoYW5jZXN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBwcm9jTmV4dCA9IGFuY2VzdG9ycy5wb3AoKTtcbiAgICAgICAgICAgIC8vdmFyIHByb2NOZXh0ID0gYW5jZXN0b3JzLnNwbGljZSgwLCAxKVswXTtcbiAgICAgICAgICAgIC8vIGNTdHlsZSBpcyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhpcyBsYXllclxuICAgICAgICAgICAgdmFyIGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHByb2NOZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyB0aGlzQmdDb2xvciBpcyB0aGUgY29sb3Igb2YgdGhpcyBsYXllciBvciBudWxsIGlmIHRoZSBsYXllciBpcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdmFyIHRoaXNCZ0NvbG9yID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJ0cmFuc3BhcmVudFwiICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJyZ2JhKDAsIDAsIDAsIDApXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcihjU3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZ3JhZGllbnQgaW52b2x2ZWQsIHNldCB0aGlzQmdDb2xvciB0byB0aGUgd29yc3QgY29sb3IgY29tYmluYXRpb24gYXZhaWxhYmxlIGFnYWluc3QgdGhlIGZvcmVncm91bmRcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZiAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YoXCJncmFkaWVudFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIHZhciBncmFkQ29sb3JzIDogc3RyaW5nW10gPSBjU3R5bGUuYmFja2dyb3VuZEltYWdlLm1hdGNoKHJlQ29sb3IpO1xuICAgICAgICAgICAgICAgIGlmIChncmFkQ29sb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmFkQ29sb3JDb21wIDogQ29sb3JPYmpbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYWRDb2xvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhZENvbG9yc1tpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21wID0gQ29sb3JVdGlsLkNvbG9yKGdyYWRDb2xvcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbXAuYWxwaGEgIT09IHVuZGVmaW5lZCAmJiBjb2xvckNvbXAuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1peCB0aGUgZ3JkaWVudCBiZyBjb2xvciB3aXQgcGFyZW50IGJnIGlmIGFscGhhIDwgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcFN0YWNrQmcgPSB0aGlzU3RhY2tCRyB8fCBwcmlvclN0YWNrQkc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ29tcCA9IGNvbG9yQ29tcC5nZXRPdmVybGF5Q29sb3IoY29tcFN0YWNrQmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JDb21wLnB1c2goY29sb3JDb21wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IGd1ZXNzR3JhZENvbG9yKGdyYWRDb2xvckNvbXAsIHRoaXNTdGFja0JHIHx8IHByaW9yU3RhY2tCRywgZmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi1zb2xpZCBvcGFjaXR5XG4gICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gbnVsbCB8fCAoY1N0eWxlLm9wYWNpdHkgJiYgY1N0eWxlLm9wYWNpdHkubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KGNTdHlsZS5vcGFjaXR5KSA8IDEpKSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IHN0YWNrLCByZXNldFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcuYWxwaGEgPSB0aGlzU3RhY2tPcGFjaXR5ICogdGhpc1N0YWNrQWxwaGE7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yU3RhY2tCRyA9IHRoaXNTdGFja0JHLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tPcGFjaXR5ID0gMS4wO1xuICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNTdHlsZS5vcGFjaXR5ICYmIGNTdHlsZS5vcGFjaXR5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrT3BhY2l0eSA9IHBhcnNlRmxvYXQoY1N0eWxlLm9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpc0JnQ29sb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNTdGFja0JHLmFscGhhO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gMS4wICYmIHRoaXNTdGFja0FscGhhID09PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSBzb2xpZCBjb2xvciBiYWNrZ3JvdW5kcyBhbmQgZ3JhZGllbnQgY29sb3IgYmFja2dyb3VuZHNcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXNCZ0NvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN0YWNrIGFscmVhZHkgaGFzIGEgYmFja2dyb3VuZCBjb2xvciwgYmxlbmQgaXRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrQkcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzU3RhY2tCRy5hbHBoYTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yLmdldE92ZXJsYXlDb2xvcih0aGlzU3RhY2tCRyk7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpc1N0YWNrQWxwaGEgPSB0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAjNTI2OiBJZiB0aGlzQmdDb2xvciBoYWQgYW4gYWxwaGEgdmFsdWUsIGl0IG1heSBub3QgZXhwb3NlIHRocm91Z2ggdGhpc1N0YWNrQkcgaW4gdGhlIGFib3ZlIGNvZGVcbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB3aXBlIG91dCB0aGUgZ3JhZGllbnQgaW5mbyBpZiB0aGlzIGxheWVyIHdhcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSAxLjAgJiYgdGhpc1N0YWNrQWxwaGEgPT09IDEuMCAmJiAodGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wKSA9PT0gMS4wICYmICh0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgIT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZihcImdyYWRpZW50XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IodGhpc1N0YWNrQkcpO1xuICAgICAgICAgICAgZGVsZXRlIGZnLmFscGhhO1xuICAgICAgICB9XG4gICAgICAgIGZnLmFscGhhID0gKGZnLmFscGhhIHx8IDEpICogdGhpc1N0YWNrT3BhY2l0eTtcbiAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXNTdGFja0JHLmFscGhhID0gdGhpc1N0YWNrT3BhY2l0eSAqIHRoaXNTdGFja0FscGhhO1xuICAgICAgICAgICAgcHJpb3JTdGFja0JHID0gdGhpc1N0YWNrQkcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0VmFsLmZnID0gZmc7XG4gICAgICAgIHJldFZhbC5iZyA9IHByaW9yU3RhY2tCRztcblxuICAgICAgICBpZiAoY1N0eWxlLnRleHRTaGFkb3cgJiYgY1N0eWxlLnRleHRTaGFkb3cgIT09ICdub25lJylcbiAgICAgICAgICAgIHJldFZhbC50ZXh0U2hhZG93ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQsIHRoZW4uLi5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvck9iaiB7XG4gICAgcmVkIDogbnVtYmVyO1xuICAgIGdyZWVuIDogbnVtYmVyO1xuICAgIGJsdWUgOiBudW1iZXI7XG4gICAgYWxwaGEgOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyZWQgOiBzdHJpbmcgfCBudW1iZXIsIGdyZWVuIDogc3RyaW5nIHwgbnVtYmVyLCBibHVlIDogc3RyaW5nIHwgbnVtYmVyLCBhbHBoYT8gOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgZnVuY3Rpb24gZml4Q29tcG9uZW50KGNvbXAgOiBzdHJpbmcgfCBudW1iZXIpIDogbnVtYmVyIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGNvbXApICE9IHR5cGVvZiAoXCJcIikpIHJldHVybiBjb21wIGFzIG51bWJlcjtcbiAgICAgICAgICAgIGxldCBjb21wU3RyID0gY29tcCBhcyBzdHJpbmc7XG4gICAgICAgICAgICBjb21wU3RyID0gY29tcFN0ci50cmltKCk7XG4gICAgICAgICAgICBpZiAoY29tcFN0cltjb21wU3RyLmxlbmd0aCAtIDFdICE9IFwiJVwiKSByZXR1cm4gcGFyc2VJbnQoY29tcFN0cik7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGNvbXBTdHIuc3Vic3RyaW5nKDAsIGNvbXBTdHIubGVuZ3RoIC0gMSkpICogMi41NSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWQgPSBmaXhDb21wb25lbnQocmVkKTtcbiAgICAgICAgdGhpcy5ncmVlbiA9IGZpeENvbXBvbmVudChncmVlbik7XG4gICAgICAgIHRoaXMuYmx1ZSA9IGZpeENvbXBvbmVudChibHVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWxwaGEgPSAodHlwZW9mIChhbHBoYSkgPT09IHR5cGVvZiAoXCJcIikpID8gcGFyc2VGbG9hdChhbHBoYSBhcyBzdHJpbmcpIDogYWxwaGEgYXMgbnVtYmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9IZXhIZWxwKHZhbHVlIDogbnVtYmVyKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBNYXRoLnJvdW5kKHZhbHVlKS50b1N0cmluZygxNik7XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIFwiMFwiICsgcmV0VmFsO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH07XG5cbiAgICB0b0hleCgpIDogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy50b0hleEhlbHAodGhpcy5yZWQpICsgdGhpcy50b0hleEhlbHAodGhpcy5ncmVlbikgKyB0aGlzLnRvSGV4SGVscCh0aGlzLmJsdWUpO1xuICAgIH07XG5cbiAgICBjb250cmFzdFJhdGlvKGJnQ29sb3IgOiBDb2xvck9iaikgeyBcbiAgICAgICAgbGV0IGZnQ29sb3I6IENvbG9yT2JqID0gdGhpcztcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICBmZ0NvbG9yID0gdGhpcy5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgXG4gICAgICAgIGxldCBsdW0xID0gZmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBpZiAoIWJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UpIHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBiZ0NvbG9yKSB7XG4gICAgICAgICAgICAgICAgcyArPSBrZXkgKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxlcnQoYmdDb2xvcik7XG4gICAgICAgICAgICBhbGVydChzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbHVtMiA9IGJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgbGV0IHJhdGlvID0gKGx1bTEgPiBsdW0yKSA/IChsdW0xICsgLjA1KSAvIChsdW0yICsgLjA1KSA6IChsdW0yICsgLjA1KSAvIChsdW0xICsgLjA1KTtcbiAgICAgICAgcmV0dXJuIHJhdGlvO1xuICAgIH07XG5cbiAgICByZWxhdGl2ZUx1bWluYW5jZSgpIDogbnVtYmVyIHtcbiAgICAgICAgbGV0IFIgPSB0aGlzLnJlZCAvIDI1NS4wO1xuICAgICAgICBsZXQgRyA9IHRoaXMuZ3JlZW4gLyAyNTUuMDtcbiAgICAgICAgbGV0IEIgPSB0aGlzLmJsdWUgLyAyNTUuMDtcbiAgICAgICAgUiA9IFIgPD0gLjA0MDQ1ID8gUiAvIDEyLjkyIDogTWF0aC5wb3coKFIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICBHID0gRyA8PSAuMDQwNDUgPyBHIC8gMTIuOTIgOiBNYXRoLnBvdygoRyArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIEIgPSBCIDw9IC4wNDA0NSA/IEIgLyAxMi45MiA6IE1hdGgucG93KChCICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgcmV0dXJuIDAuMjEyNiAqIFIgKyAwLjcxNTIgKiBHICsgMC4wNzIyICogQjtcbiAgICB9O1xuXG4gICAgbWl4KGNvbG9yMiA6IENvbG9yT2JqLCBwZXJjVGhpcyA6IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKGNvbG9yMi5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmooXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLnJlZCArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLnJlZCxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuZ3JlZW4gKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ncmVlbixcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuYmx1ZSArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmJsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWxwaGFUaGlzID0gdGhpcy5hbHBoYSA/IHRoaXMuYWxwaGEgOiAxO1xuICAgICAgICAgICAgbGV0IGFscGhhT3RoZXIgPSBjb2xvcjIuYWxwaGEgPyBjb2xvcjIuYWxwaGEgOiAxO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMucmVkICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIucmVkLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ncmVlbiArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmdyZWVuLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ibHVlICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuYmx1ZSxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIGFscGhhVGhpcyArICgxIC0gcGVyY1RoaXMpICogYWxwaGFPdGhlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBnZXRPdmVybGF5Q29sb3IoYmdDb2xvciA6IENvbG9yT2JqKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMuYWxwaGEgPj0gMSkge1xuICAgICAgICAgICAgLy8gTm8gbWl4aW5nIHJlcXVpcmVkIC0gaXQncyBvcGFxdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMCkge1xuICAgICAgICAgICAgLy9cdFx0SGFhYy5FcnJvci5sb2dFcnJvcihcIkludmFsaWQgYWxwaGEgdmFsdWVcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChiZ0NvbG9yLmFscGhhKSAhPSBcInVuZGVmaW5lZFwiICYmIGJnQ29sb3IuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAvL1x0XHRIYWFjLkVycm9yLmxvZ0Vycm9yKFwiQ2Fubm90IG1peCB3aXRoIGEgYmFja2dyb3VuZCBhbHBoYVwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLm1peChiZ0NvbG9yLCB0aGlzLmFscGhhKTtcbiAgICAgICAgZGVsZXRlIHJldFZhbC5hbHBoYTsgXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQ1NTQ29sb3IoY3NzU3R5bGVDb2xvcikge1xuICAgICAgICBsZXQgdGhpc1JlZCA9IC0xO1xuICAgICAgICBsZXQgdGhpc0dyZWVuID0gLTE7XG4gICAgICAgIGxldCB0aGlzQmx1ZSA9IC0xO1xuXG4gICAgICAgIGNzc1N0eWxlQ29sb3IgPSBjc3NTdHlsZUNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1JlZCA9IG1bMV07XG4gICAgICAgICAgICAgICAgdGhpc0dyZWVuID0gbVsyXTtcbiAgICAgICAgICAgICAgICB0aGlzQmx1ZSA9IG1bM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiYVxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKC4rKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNSZWQgPSBtWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNHcmVlbiA9IG1bMl07XG4gICAgICAgICAgICAgICAgdGhpc0JsdWUgPSBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwW2Nzc1N0eWxlQ29sb3JdO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbUhleCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbG9va3VwID0ge1xuICAgICAgICAgICAgICAgICAgICBcImFcIjogMTAsXG4gICAgICAgICAgICAgICAgICAgIFwiYlwiOiAxMSxcbiAgICAgICAgICAgICAgICAgICAgXCJjXCI6IDEyLFxuICAgICAgICAgICAgICAgICAgICBcImRcIjogMTMsXG4gICAgICAgICAgICAgICAgICAgIFwiZVwiOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgXCJmXCI6IDE1XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwgKiAxNiArXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludCh2YWwuY2hhckF0KGkpIGluIGxvb2t1cCA/IGxvb2t1cFt2YWwuY2hhckF0KGkpXSA6IHZhbC5jaGFyQXQoaSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRocmVlLWRpZ2l0IFJHQiAoI3JnYikgaXMgY29udmVydGVkIHRvIHNpeC1kaWdpdCBmb3JtICgjcnJnZ2JiKSBieSByZXBsaWNhdGluZyBkaWdpdHNcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci0zLyNyZ2ItY29sb3IpXG4gICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IFwiI1wiICsgY3NzU3R5bGVDb2xvci5jaGFyQXQoMSkucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMikucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMykucmVwZWF0KDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1JlZCA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMykpO1xuICAgICAgICAgICAgdGhpc0dyZWVuID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSk7XG4gICAgICAgICAgICB0aGlzQmx1ZSA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4vQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tb25VdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5wdXRfdHlwZV93aXRoX3BsYWNlaG9sZGVyID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJudW1iZXJcIl07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF90ZXh0X3R5cGVzID0gW1xuICAgICAgICBcInRleHRcIiwgXCJmaWxlXCIsIFwicGFzc3dvcmRcIixcbiAgICAgICAgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsXG4gICAgICAgIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZW1haWxcIiwgIC8vSFRNTCA1LiBOb3RlOiB0eXBlID0gXCJoaWRkZW5cIiBkb2Vzbid0IHJlcXVpcmUgdGV4dFxuICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLFxuICAgICAgICBcInRpbWVcIiwgXCJjb2xvclwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X3RpbWVfdHlwZXMgPSBbXG4gICAgICAgIFwiZGF0ZVwiLCBcIm1vbnRoXCIsIFwid2Vla1wiLCBcInRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X290aGVyX3R5cGVzID0gW1xuICAgICAgICBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsIFwiZmlsZVwiLCBcImltYWdlXCJcbiAgICBdO1xuICAgIHB1YmxpYyBzdGF0aWMgZm9ybV9idXR0b25fdHlwZXMgPSBbXG4gICAgICAgIFwiYnV0dG9uXCIsIFwicmVzZXRcIiwgXCJzdWJtaXRcIlxuICAgIF07XG5cbiAgICBwdWJsaWMgc3RhdGljIGZvcm1fbGFiZWxhYmxlX2VsZW1lbnRzID0gW1wiaW5wdXRcIiwgIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCIsIFwiYnV0dG9uXCJdO1xuXG4gICAgcHVibGljIHN0YXRpYyB0YWJUYWdNYXAgPSB7XG4gICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHRydWUsXG4gICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCIgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjogdHJ1ZSxcbiAgICAgICAgLyoqXCJkaXZcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKTtcbiAgICAgICAgfSwqL1xuICAgICAgICBcImFcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIHhsaW5rOmhyZWY/PyBzZWUgc3ZnXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImFyZWFcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXVkaW9cIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRyb2xzXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInZpZGVvXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250cm9sc1wiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdW1tYXJ5XCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBmaXJzdCBzdW1tYXJ5IGNoaWxkIG9mIGEgZGV0YWlscyBlbGVtZW50IGlzIGF1dG9tYXRpY2FsbHkgZm9jdXNhYmxlIFxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBlbGVtZW50LnBhcmVudEVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2RldGFpbHMnXG4gICAgICAgICAgICAgICAgJiYgRE9NVXRpbC5zYW1lTm9kZShbLi4uZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWxlbSA9PiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JylbMF0sIGVsZW1lbnQpO1xuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vZGV0YWlscyBlbGVtZW50IHdpdGhvdXQgYSBkaXJlY3Qgc3VtbWFyeSBjaGlsZCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRyZW4gJiYgWy4uLmVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKS5sZW5ndGggPT09IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHdvcmRDb3VudChzdHIpOiBudW1iZXIge1xuICAgICAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiBzdHIuc3BsaXQoL1xccysvZykubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIG9ubHkgZGV0ZWN0cyBpZiB0aGUgZWxlbWVudCBpdHNlbGYgaXMgaW4gdGhlIHRhYiBvcmRlci5cbiAgICAgKiBIb3dldmVyLCB0aGlzIGVsZW1lbnQgbWF5IGRlbGVnYXRlIGZvY3VzIHRvIGFub3RoZXIgZWxlbWVudCB2aWEgYXJpYS1hY3RpdmVkZXNjZW5kYW50LlxuICAgICAqIEFsc28sIGZvY3VzIHZhcmllcyBieSBicm93c2VyLi4uIHN0aWNraW5nIHRvIHRoaW5ncyB0aGF0IGFyZSBmb2N1c2FibGUgb24gQ2hyb21lIGFuZCBGaXJlZm94LlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNUYWJiYWJsZShlbGVtZW50KSB7XG4gICAgICAgIC8vIFVzaW5nIGh0dHBzOi8vYWxseWpzLmlvL2RhdGEtdGFibGVzL2ZvY3VzYWJsZS5odG1sXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgZXhwbGljaXQgY2FzZXMgZmlyc3RcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSA+PSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGxpY2l0IGNhc2VzIGhhbmRsZWQgLSBub3cgdGhlIGltcGxpY2l0XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwKSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGludGVyYWN0aXZlLCBidXQgbm90IG9uY2xpY2sgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NsaWNrYWJsZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyBuYXRpdmUgZm9jdXNhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gQ29tbW9uVXRpbC50YWJUYWdNYXApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgIC8vY3VzdG9tIHdpZGdldFxuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzV2lkZ2V0KGVsZW1lbnQpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgICAgIGlmICghY29udGV4dEhpZXJhcmNoaWVzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaGllciA9PiBbXCJ0YWJsZVwiLCBcImdyaWRcIiwgXCJ0cmVlZ3JpZFwiXS5pbmNsdWRlcyhoaWVyLnJvbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplU3BhY2luZyhzKSB7XG4gICAgICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIH07XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiBCdWcgcmVwb3J0cyBoYXZlIGJlZW4gYWJvdXQgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcy5cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEVxdWl2KG5vZGUsIGh0bWxFcXVpdikge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxFcXVpdi5pbmRleE9mKFwiY2hlY2tib3hcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHR5cGUgPT09IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChodG1sRXF1aXYuaW5kZXhPZihcInJhZGlvXCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcInJhZGlvXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vbkV4aXN0YW50SURzKG5vZGUsIHRhcmdldGlkcykge1xuICAgICAgICBsZXQgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgaWYgKENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0YXJnZXRpZHMpLmxlbmd0aCA8IDEpIHJldHVybiByZXR1cm5ub3Rmb3VuZGlkcztcblxuICAgICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0YXJnZXRpZHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeHAgPSBcIi8vKltAaWQ9J1wiICsgdGFyZ2V0QXJyYXlbaV0gKyBcIiddXCI7XG4gICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIG5vZGUsIGRvYy5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybm5vdGZvdW5kaWRzICs9IHRhcmdldEFycmF5W2ldICsgJywgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJldHVybm5vdGZvdW5kaWRzKS5sZW5ndGggPj0gMilcbiAgICAgICAgICAgIHJldHVybm5vdGZvdW5kaWRzID0gcmV0dXJubm90Zm91bmRpZHMuc3Vic3RyaW5nKDAsIHJldHVybm5vdGZvdW5kaWRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9ICcnO1xuICAgICAgICByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREb2NFbGVtZW50c0J5VGFnKGVsZW0sIHRhZ05hbWUpIHtcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pIGFzIGFueTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCBjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3RhZ05hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldENoaWxkQnlUYWdIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBwYXJlbnRFbGVtIC0gVGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge3N0cmluZ30gdGFnTmFtZSAtIFRoZSB0YWcgdG8gc2VhcmNoIGZvciB1bmRlciB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCB0aGUgdGFnIHNob3VsZCBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSB0YWcgdW5kZXIgdGhlIHBhcmVudCB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGlnbm9yZUhpZGRlbiwgY29uc2lkZXJIaWRkZW5TZXR0aW5nKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50RWxlbS5maXJzdENoaWxkO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdFxuICAgICAgICAvLyBtYXRjaCB0aGUgdGFnTmFtZSBwcm92aWRlZFxuICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkge1xuXG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIGNoaWxkcmVuIGludG8gdGhlIHJldHVybiBhcnJheSBpZiB0aGV5IG1hdGNoIHdpdGggdGFnbmFtZS5cbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGlnbm9yZWhpZGRlbiB3YXMgc2V0IHRvIHRydWUsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2tcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2lsYmxlIHdlIG1vcmUgdG8gdGhlc2VzIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBub2RlLlxuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBjb3VwbGUgb2YgY2hlY2tzIHRvIGRldGVybWluZSBpZiBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBXaGVuIGlnbm9yZUhpZGRlbiBpcyBzZXQgdG8gdHJ1ZSB1cGZyb250LCB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgLy8gIDIuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAvLyAgMi4xLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gfHwgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiAhQ29tbW9uVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQoY2hpbGQpKSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBtYXRjaCBnaXZlbiByb2xlcyhzKS5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgcm9sZShzKSB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIFxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIHRvIGVsZW1lbnQgYXNzb2ljYXRpb24gaXMgYWxyZWFkeSBtYWRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgaGFzQXR0cmlidXRlXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHVzZSB0aGF0IG9uZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgbGV0IHJvbGVUb0VsZW1zID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgcm9sZSB0byBlbGVtZW50LCB0aGlzIGlzIHdoZXJlIHdlIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGFuZCBleHRyYWN0IGFsbCB0aGVcbiAgICAgICAgLy8gZWxlbWVudHMgYnNhZWQgb24gcm9sZXMuXG4gICAgICAgIGlmIChyb2xlVG9FbGVtcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aGUgcm9sZVRvRWxlbXMgaGFzaFxuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSB7fTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBib2R5IG9mIHRoZSBkb2NcbiAgICAgICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBhcmUgYXQgdGhlIHZlcnkgcGFyZW50IG5vZGUgb2YgdGhlIGVudGlyZSBwYWdlLCBzbyB0aGF0IHdlIGNhbiBsb29wIHRocm91Z2hcbiAgICAgICAgICAgIC8vIGFsbCB0aGUgbm9kZXMuXG4gICAgICAgICAgICB3aGlsZSAoRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCdWlsZCBhIG5vZGV3YWx0ZXIgYmFzZWQgb2YgdGhlIHJvb3Qgbm9kZSwgdGhpcyBub2RlIHdhbHRlciB3aWxsIGJlIHVzZSBsb29wIG92ZXIgYWxsIHRoZSBub2Rlc1xuICAgICAgICAgICAgLy8gYW5kIGJ1aWxkIHRoZSByb2xlcyB0byBFbGVtZW50IGNvcmFsYXRpb25cbiAgICAgICAgICAgIC8vbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocm9vdCk7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJvb3QpO1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHRoZSBlbnRpcmUgZG9jL2xpc3Qgb2Ygbm9kZXMgdG8gYnVpbGQgdGhlIHJvbGUgdG8gZWxlbWVudCBtYXBcbiAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBidWlsZCBhbiByb2xlVG9FbGVtcyBoYXNoIHdoaWNoIGlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0LlxuICAgICAgICAgICAgLy8gcm9sZVRvRWxlbXMgPSB7XG4gICAgICAgICAgICAvLyAgICBkb2N1bWVudDogW3tkaXZ9LHthYmJyfSx7dmFyfV0sXG4gICAgICAgICAgICAvLyAgICBtYWluOiBbe2Rpdn1dLFxuICAgICAgICAgICAgLy8gICAgbmF2aWdhdGlvbjogW3tkaXZ9XVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmVsZW0oKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gT25seSBjaGVjayB0aGUgZWxlbWVudHMgd2hpY2ggaGF2ZSB0aGUgcm9sZSBhdHRyaWJ1dGUgYXNzaWNpYXRlZCB0byB0aGVtXG4gICAgICAgICAgICAgICAgaWYgKCFudy5iRW5kVGFnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdSb2xlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIHRoZSBub2RlIGhhcyByb2xlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKG53LmVsZW0oKSAmJiBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBhbGwgdGhlIHJvbGVzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIHRoaXMgZWxlbWVudCwgY2FuIGhhdmUgbXVsdGlwbGUgcm9sZXMgb24gb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHNwbGl0IGJ5IHNwYWNlLCBzbyB3ZSBuZWVkIHRvIGV4dHJhY3QgYWxsIG9mIHRoZW0gaW50byBhbiBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdSb2xlcyA9IG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5lbGVtKCkgJiYgd1JvbGVzLmxlbmd0aCA9PT0gMCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHdSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDEuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiBDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgcm9sZXMgYW5kIGFzc2lnbmVkIHRoaXMgbm9kZSB0byBhbGwgdGhlcyByb2xlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGUgcm9sZSBrZXkgaXMgbm90IGFscmVhZHkgaW4gdGhlIHJvbGVUb0VsZW1zIGhhc2gsIGNvbnN0cnVjdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUga2V5IGFuZCBhc3NpZ24gZW1wdHkgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh3Um9sZXNbaV0gaW4gcm9sZVRvRWxlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVRvRWxlbXNbd1JvbGVzW2ldXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGFycmF5IGZvciB0aGUgcm9sZVxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVRvRWxlbXNbd1JvbGVzW2ldXS5wdXNoKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHJvbGVUb0VsZW1zIGhhc2ggbWFwIGFzIGEgZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJBcmlhVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVfSU1QTElDSVRcIiwgcm9sZVRvRWxlbXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRVwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpbGl6ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2VzIHdoZXJlIHRoZSBwcm92aWRlZCByb2xlIGlzIGEgc3RyaW5nIGFuZCBub3QgYW4gYXJyYXksXG4gICAgICAgIC8vIGZvciB0aGlzIGNhc2Ugd2UgdGFrZSB0aGUgc3RyaW5nIGFuZCBwdXQgaXQgaW50byBhbiBhcnJheVxuICAgICAgICBpZiAodHlwZW9mIChyb2xlcykgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCByb2xlID0gcm9sZXM7XG4gICAgICAgICAgICByb2xlcyA9IFtdO1xuICAgICAgICAgICAgcm9sZXMucHVzaChyb2xlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcm9sZXMgdGhhdCB3ZXJlIHByb3ZpZGVkIGFuZCBmaW5kIHRoZSBsaXN0IG9mIGVsZW1lbnRzIGZvciB0aGlzIHJvbGVzXG4gICAgICAgIC8vIGFuZCBhZGQgdGhlbSB0byB0aGUgcmV0dXJuIHZhbHVlLlxuICAgICAgICBpZiAocm9sZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBsb29wIG92ZXIgYWxsIHRoZSByb2xlc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHJvbGUgZnJvbSB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFJvbGUgPSByb2xlc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIGZvciB0aGlzIHJvbGVcbiAgICAgICAgICAgICAgICBsZXQgY29weVJvbGVzID0gcm9sZVRvRWxlbXNbbmV4dFJvbGVdO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGVsZW1lbnRzIHRvIGNvcHkgdG8gYW5vdGhlciBhcnJheSwgdGhlbiBwZXJmb3JtIHRoZSBjb3B5XG4gICAgICAgICAgICAgICAgaWYgKGNvcHlSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBhcmUgdG8gYmUgY29waWVkXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29weVJvbGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBlbGVtZW50IHRvIHRoZSByZXR1cm4gdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucHVzaChjb3B5Um9sZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICogYSB0YXJnZXQgaXMgZW4gZWxlbWVudCB0aGF0IGFjY2VwdCBhIHBvaW50ZXIgYWN0aW9uIChjbGljayBvciB0b3VjaClcbiAgICAgICAgICogXG4gICAgICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNUYXJnZXQoZWxlbWVudCkgeyBcbiAgICAgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQubm9kZVR5cGUgIT09IDEgXG4gICAgICAgICAgICB8fCBbXCJodG1sXCIsIFwiYm9keVwiXS5pbmNsdWRlcyhlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFtcInN2Z1wiLCBcInByZVwiLCBcImNvZGVcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCIsICdoZWFkJ10pICE9PSBudWxsIFxuICAgICAgICAgICAgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSB8fCBWaXNVdGlsLmlzTm9kZVZpc3VhbGx5SGlkZGVuKGVsZW1lbnQpIFxuICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChlbGVtZW50KSB8fCBWaXNVdGlsLmlzRWxlbWVudE9mZnNjcmVlbihlbGVtZW50KSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzQ2xpY2thYmxlKGVsZW1lbnQpKSBcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldF9yb2xlcyA9IFtcImxpc3RpdGVtXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic3dpdGNoXCIsIFwidHJlZWl0ZW1cIl07XG4gICAgICAgIGlmICh0YXJnZXRfcm9sZXMuaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgIC8vIGZpbmQgdGhlIHByb3BlciBwYXJlbnQgZWxlbWVudHNcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50X3JvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAvLyBkYXRhbGlzdCwgZmllbGRzZXQsIG9wdGdyb3VwLCBldGMuIG1heSBiZSBqdXN0IHVzZWQgZm9yIGdyb3VwaW5nIHB1cnBvc2UsIHNvIGdvIHVwIHRvIHRoZSBwYXJlbnRcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50X3JvbGUgPT09ICdncm91cCcpXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIENvbW1vblV0aWwuaXNUYXJnZXQocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RmlsZUV4dCh1cmwpIHtcbiAgICAgICAgbGV0IG0gPSB1cmwubWF0Y2goL1xcLigoW147PyNcXC5dfF4kKSspKFs7PyNdfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIFwiLlwiICsgbVsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlQW5jaG9yKHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvIygoW147P1xcLl18XiQpKykoWzs/XXwkKS8pO1xuICAgICAgICBpZiAobSAhPSBudWxsICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNoZWNrT2JqRW1iZWQobm9kZSwgZXh0VGVzdCwgbWltZVRlc3QpIHtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSAhPSBcIm9iamVjdFwiICYmIG5vZGVOYW1lICE9IFwiZW1iZWRcIiAmJlxuICAgICAgICAgICAgbm9kZU5hbWUgIT0gXCJhXCIgJiYgbm9kZU5hbWUgIT0gXCJhcmVhXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICAvLyBDaGVjayBtaW1lIHR5cGVcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0VmFsID0gbWltZVRlc3QobWltZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoXCJjb2RldHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IG1pbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcImNvZGV0eXBlXCIpO1xuICAgICAgICAgICAgcmV0VmFsID0gbWltZVRlc3QobWltZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aGUgZmlsZW5hbWVcbiAgICAgICAgaWYgKCFyZXRWYWwpIHtcbiAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZW1iZWRcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImFcIiB8fCBub2RlTmFtZSA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoXCJkYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcImRhdGFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT09IG51bGwpIGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGxldCBleHQgPSBDb21tb25VdGlsLmdldEZpbGVFeHQoZmlsZW5hbWUpO1xuICAgICAgICAgICAgcmV0VmFsID0gZXh0VGVzdChleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGZpbGVuYW1lcyBpbiB0aGUgcGFyYW1zXG4gICAgICAgIGlmICghcmV0VmFsICYmIG5vZGVOYW1lID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IENoZWNrIEhpZGRlbiBPcHRpb24gaXMgc2V0IHRoZW4gY29tcGx5IHdpdGggdGhhdCBzZXR0aW5nXG4gICAgICAgICAgICBsZXQgcGFyYW1zID0gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKG5vZGUsIFwicGFyYW1cIiwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgcGFyYW1zICE9IG51bGwgJiYgaSA8IHBhcmFtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHBhcmFtc1tpXS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBleHRUZXN0KENvbW1vblV0aWwuZ2V0RmlsZUV4dChwYXJhbXNbaV0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9PYmpFbWJlZExpbmsobm9kZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5jaGVja09iakVtYmVkKG5vZGUsIENvbW1vblV0aWwuaXNBdWRpb0V4dCwgZnVuY3Rpb24gKG1pbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW1lLnN0YXJ0c1dpdGgoXCJhdWRpb1wiKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0F1ZGlvRXh0KGV4dCkge1xuICAgICAgICBsZXQgYXVkaW9fZXh0ZW5zaW9ucyA9IFtcIi5haWZcIiwgXCIuYWlmY1wiLCBcIi5haWZmXCIsIFwiLmFpclwiLCBcIi5hc2ZcIiwgXCIuYXVcIiwgXCIuY2RhXCIsXG4gICAgICAgICAgICBcIi5kc21cIiwgXCIuZHNzXCIsIFwiLmR3ZFwiLCBcIi5pZmZcIiwgXCIua2FyXCIsIFwiLm0xYVwiLCBcIi5tZWRcIixcbiAgICAgICAgICAgIFwiLm1wMlwiLCBcIi5tcDNcIiwgXCIubXBhXCIsIFwiLnBjbVwiLCBcIi5yYVwiLCBcIi5yYW1cIiwgXCIucm1cIixcbiAgICAgICAgICAgIFwiLnNhbVwiLCBcIi5zZlwiLCBcIi5zZjJcIiwgXCIuc21wXCIsIFwiLnNuZFwiLCBcIi5zdnhcIiwgXCIudWxcIixcbiAgICAgICAgICAgIFwiLnZvY1wiLCBcIi53YXZcIiwgXCIud21hXCIsIFwiLnd2ZVwiXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLnZhbEluQXJyYXkoZXh0LnRvTG93ZXJDYXNlKCksIGF1ZGlvX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9PYmpFbWJlZExpbmsobm9kZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5jaGVja09iakVtYmVkKG5vZGUsIENvbW1vblV0aWwuaXNWaWRlb0V4dCwgZnVuY3Rpb24gKG1pbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW1lLnN0YXJ0c1dpdGgoXCJ2aWRlb1wiKSB8fFxuICAgICAgICAgICAgICAgIG1pbWUuc3RhcnRzV2l0aChcImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc1ZpZGVvRXh0KGV4dCkge1xuICAgICAgICBsZXQgdmlkZW9fZXh0ZW5zaW9ucyA9IFtcIi5hc2ZcIiwgXCIuYXZpXCIsIFwiLmRpdnhcIiwgXCIuZHZcIiwgXCIubTF2XCIsIFwiLm0ycFwiLCBcIi5tMnZcIiwgXCIubW9vdlwiLFxuICAgICAgICAgICAgXCIubW92XCIsIFwiLm1wNFwiLCBcIi5tcGVnXCIsIFwiLm1wZ1wiLCBcIi5tcHZcIiwgXCIub2dtXCIsIFwiLm9tZlwiLCBcIi5xdFwiLFxuICAgICAgICAgICAgXCIucm1cIiwgXCIucnZcIiwgXCIuc21pXCIsIFwiLnNtaWxcIiwgXCIuc3dmXCIsIFwiLnZvYlwiLCBcIi53bXZcIiwgXCIucm12YlwiLFxuICAgICAgICAgICAgXCIubXZiXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgdmlkZW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNJbWFnZU9iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc0ltZ0V4dCwgZnVuY3Rpb24gKG1pbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBtaW1lLnN0YXJ0c1dpdGgoXCJpbWFnZVwiKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbWFnZV9leHRlbnNpb25zID0gW1wiLmJtcFwiLCBcIi5naWZcIiwgXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucGN4XCIsIFwiLnBuZ1wiXTtcbiAgICAgICAgXG4gICAgcHVibGljIHN0YXRpYyBpc0ltZ0V4dChleHQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgQ29tbW9uVXRpbC5pbWFnZV9leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0h0bWxFeHQoZXh0KSB7XG4gICAgICAgIGxldCBodG1sX2V4dGVuc2lvbnMgPSBbXCIuYXNwXCIsIFwiLmFzcHhcIiwgXCIuY2ZtXCIsIFwiLmNmbWxcIiwgXCIuY2dpXCIsIFwiLmh0bVwiLCBcIi5odG1sXCIsIFwiLnNodG1cIixcbiAgICAgICAgICAgIFwiLnNodG1sXCIsIFwiLnBocFwiLCBcIi5wbFwiLCBcIi5weVwiLCBcIi5zaHRtXCIsIFwiLnNodG1sXCIsIFwiLnhodG1sXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgaHRtbF9leHRlbnNpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc1RyaWdnZXJlZChkb2MsIGlkKSB7XG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBpZCwgZmFsc2UpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHRyaWdnZXJPbmNlKGRvYywgaWQsIHBhc3NlZCkge1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IHRyaWdnZXJlZCA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIGlkLCBmYWxzZSk7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIGlkLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRyaWdnZXJlZDtcbiAgICB9XG5cbiAgICAvKiBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHZhbHVlIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gYXJyYXkgKi9cbiAgICBwdWJsaWMgc3RhdGljIHZhbEluQXJyYXkodmFsdWUsIGFycikge1xuICAgICAgICBmb3IgKGxldCBpZHggaW4gYXJyKSB7XG4gICAgICAgICAgICBpZiAoYXJyW2lkeF0gPT09IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAqIEBwYXJhbSB0YWdOYW1lcyBzdHJpbmcsIGFycmF5LCBvciBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHRhZ3MgdG8gc2VhcmNoIGZvclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3IoZWxlbWVudCwgdGFnTmFtZXMpIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdGhpc1RhZyA9IHdhbGtOb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mICh0YWdOYW1lcykgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1RhZyA9PT0gdGFnTmFtZXMudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRhZ05hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkeCBpbiB0YWdOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnTmFtZXNbaWR4XSA9PT0gdGhpc1RhZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNUYWcgaW4gdGFnTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50MSBhbmQgZWxlbWVudDIgYXJlIHNpYmxpbmdzXG4gICAgcHVibGljIHN0YXRpYyBpc1NpYmxpbmcoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gICAgICAgIGlmIChlbGVtZW50MSAmJiBlbGVtZW50Mikge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKSAmJiBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50MSkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50MSkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gZWxlbWVudDIpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGNoaWxkKSB7XG4gICAgICAgIGxldCBub2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoY2hpbGQpO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vY2hlY2sgaWYgdGhlIGZpcnN0IGZvcm0gY29udHJvbCBjaGlsZCBpcyBkaXNhYmxlZFxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5Rmlyc3RDaGlsZEZvcm1FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGZvcm1FbGVtZW50cyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCJdO1xuICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm9ybUVsZW1lbnRzLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQobncubm9kZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlSZWZlcnJpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IHJvb3QgPSBkb2MuYm9keTtcbiAgICAgICAgd2hpbGUgKERPTVdhbGtlci5wYXJlbnROb2RlKHJvb3QpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIHJvb3QgPSBET01XYWxrZXIucGFyZW50Tm9kZShyb290KTtcbiAgICAgICAgfVxuICAgICAgICAvL2xldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHJvb3QpO1xuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJvb3QpO1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGVsZW1lbnQgd2hvc2UgJ2FyaWEtZGVzY3JpYmVkYnknIGVxdWFscyB0byB0aGUgaWRcbiAgICAgICAgICAgIGlmIChudy5ub2RlICYmIG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgbncuZWxlbSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IEFyaWFEZXNjcmliZWRieUlEQXJyYXkgPSAobncuZWxlbSgpLmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikgfHwgXCJcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGlmIChBcmlhRGVzY3JpYmVkYnlJREFycmF5LmluY2x1ZGVzKGlkKSAmJiBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIGdldCBlbGVtZW50IGNvbnRhaW5pbmcgbGFiZWwgZm9yIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgICAgICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgZnVuY3Rpb24gbmFtZSBpcyBtaXNsZWFkaW5nLiBVc2UgZ2V0TGFiZWxGb3JFbGVtZW50KGVsZW1lbnQpIGluc3RlYWRcbiAgICAgICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnB1dExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBsYWJlbCBlbGVtZW50IGZvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2VsZW1lbnR9IGVsZW1lbnQgLSByZXR1cm4gdGhlIGVsZW1lbnQgZm9yIHRoZSBsYWJlbCwgb3RoZXJ3aXNlIG51bGxcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFiZWxGb3JFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKGVsZW1lbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgY29udGFpbmluZyBsYWJsZSBlbGVtZW50IGlzIGhpZGRlbiwgd2hlbiB0aGUgaWdub3JlSGlkZGVuIG9wdGlvblxuICAgICAqIGlzIHNldCB0byB0cnVlLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBsYWJlbCBlbGVtZW50IGZvci5cbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCBsYWJlbCBzaG91bGQgYmUgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50OiBFbGVtZW50LCBpZ25vcmVIaWRkZW4pIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGdsb2JhbCBBcmlhVXRpbF9MQUJFTFMgaGFzaCBpcyBhdmFpbGFibGUsIGFzIHRoaXMgd2lsbCBjb250YWluIHRoZSBsYWJlbCBub2RlcyBiYXNlZCBvblxuICAgICAgICAvLyBmb3IgYXR0cmlidXRlLlxuICAgICAgICAvL2lmICghZ2V0Q2FjaGUoZWxlbWVudC5vd25lckRvY3VtZW50LFwiQXJpYVV0aWxfTEFCRUxTXCIsIG51bGwpKSB7XG4gICAgICAgIGxldCByb290ID0gZWxlbWVudC5nZXRSb290Tm9kZSgpO1xuICAgICAgICBpZiAoIUNhY2hlVXRpbC5nZXRDYWNoZSgocm9vdC5ub2RlVHlwZSA9PT0gMTEpID8gPFNoYWRvd1Jvb3Q+cm9vdCA6IDxEb2N1bWVudD5yb290LCBcIkFyaWFVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgICAgIGxldCBpZFRvTGFiZWwgPSB7fVxuXG4gICAgICAgICAgICAvLyBHZXQgYWxsIHRoZSBsYWJlbCBlbGVtZW50cyBpbiB0aGUgZW50aXJlIGRvY1xuICAgICAgICAgICAgbGV0IGxhYmVsTm9kZXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcoZWxlbWVudCwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhYmVsIG5vZGVzLCBpbiB0aGUgY2FzZSB0aGUgbGFiZWwgbm9kZSBoYXMgYSBmb3IgYXR0cmlidXRlLFxuICAgICAgICAgICAgLy8gZXh0cmFjdCB0aGF0IGF0dHJpYnV0ZSBhbmQgYWRkIHRoaXMgbm9kZSB0byB0aGUgaGFzaCBpZiBpdCBpcyB2aXNpYmxlLlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYWJlbE5vZGVzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2Rlc1tpXS5oYXNBdHRyaWJ1dGUoXCJmb3JcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgaWdub3JlIGhpZGRlbiBpcyBzcGVjaWZpZWQgYW5kIHRoZSBub2RlIGlzIG5vdCB2aXNpYmxlIHdlIGRvIG5vdCBhZGQgaXQgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGxhYmVsTm9kZXMgaGFzaC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZUhpZGRlbiAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGxhYmVsTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlkVG9MYWJlbFtsYWJlbE5vZGVzW2ldLmdldEF0dHJpYnV0ZShcImZvclwiKV0gPSBsYWJlbE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBidWlsdCBoYXNoIHRvIHRoZSBvd25lckRvY3VtZW50IChkb2N1bWVudCksIHRvIGJlIHVzZWQgbGF0ZXIgdG8gZmFzdCByZXRyaXZhbFxuICAgICAgICAgICAgLy9zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIGlkVG9MYWJlbCk7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKSA/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJBcmlhVXRpbF9MQUJFTFNcIiwgaWRUb0xhYmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgYW4gaWQgYXR0cmlidXRlLCBnZXQgdGhlIGNvcm9zcG9uZGluZyBsYWJlbCBlbGVtZW50XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICAvLyBGZXRjaCB0aGUgaWQgYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgY3RybElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgIC8vIFJldHVybiB0aGUgY29yb3Nwb25kaW5nIGxhYmVsIGVsZW1lbnQuXG4gICAgICAgICAgICAvLyBOb3RlOiBpbiB0aGUgY2FzZSB0aGF0IHRoZSB0aGUgaWQgaXMgbm90IGZvdW5kIGluIHRoZSBoYXNoIHRoYXQgbWVhbnMsIGl0IGRvZXMgbm90IGV4aXN0cyBvciBpcyBoaWRkZW5cbiAgICAgICAgICAgIGlmIChjdHJsSWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL3JldHVybiBnZXRDYWNoZShlbGVtZW50LmdldFJvb3ROb2RlKCkub3duZXJEb2N1bWVudCxcIkFyaWFVdGlsX0xBQkVMU1wiLHt9KVtjdHJsSWRdO1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVV0aWwuZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKSA/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJBcmlhVXRpbF9MQUJFTFNcIiwge30pW2N0cmxJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIHNwZWNpZmllZCBlbGVtZW50IGF0dHJpYnV0ZSBpZiBwcmVzZW50IGVsc2UgcmV0dXJuIG51bGwgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cikge1xuICAgICAgICAvL3JldHVybiAoZWxlbWVudCAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgPyBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyKSA6IG51bGw7XG4gICAgICAgIGlmICghYXR0ciB8fCAhZWxlbWVudCB8fCAhZWxlbWVudC5oYXNBdHRyaWJ1dGUgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgYXRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyKVxuICAgICAgICBpZiAoIUFSSUFEZWZpbml0aW9ucy5yZWZlcmVuY2VQcm9wZXJ0aWVzLmluY2x1ZGVzKGF0dHIpKVxuICAgICAgICAgICAgcmV0dXJuIGF0clZhbHVlO1xuXG4gICAgICAgIC8vYXR0ciBpcyBhIHJlZmVyZW5jZSB0byBvdGhlciBlbGVtZW50cyhzKVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBhdHJWYWx1ZS5zcGxpdCgvICsvZyk7XG4gICAgICAgIC8vaWdub3JlIGlmIG5vbmUgb2YgdGhlIHJlZmVycmVkIGVsZW1lbnQocykgZXhpc3Qgb3IgYWxsIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICBsZXQgZXhpc3QgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaWQgPSAwOyB2YWx1ZXMgPCB2YWx1ZXMubGVuZ3RoOyArK2lkKSB7XG4gICAgICAgICAgICBjb25zdCByZWZlcnJlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHZhbHVlc1tpZF0pO1xuICAgICAgICAgICAgaWYgKHJlZmVycmVkICYmICFET01VdGlsLnNhbWVOb2RlKHJlZmVycmVkLCBlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGV4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhpc3QgPyBhdHJWYWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgZWxlbWVudCBoYXMgdmFsaWQgaW1wbGljaXQgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0ltcGxpY2l0TGFiZWwoZWxlbWVudCkge1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgXCJsYWJlbFwiKTtcbiAgICAgICAgLy8gVGVzdCAgYSkgaWYgdGhlIHBhcmVudCBpcyBhIGxhYmVsIHdoaWNoIGlzIHRoZSBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAvLyAgICAgICBiKSBpZiB0aGUgZm9ybSBlbGVtZW50IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYykgaWYgdGhlIGZvcm0gZWxlbWVudCByZXF1aXJlcyBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCA6IFwiaW5wdXRcIiwgIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCJcbiAgICAgICAgLy8gICAgICAgZCkgZm9ybSBlbGVtZW50cyB3aGljaCBtYXkgaGF2ZSBhIGxhYmVsOiBidXR0b25cbiAgICAgICAgLy8gZm9ybSBlbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIGltcGxpY2l0IG9yIGV4cGxpY2l0IGxhYmVsIGVsZW1lbnQgYXJlOlxuICAgICAgICAvLyBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZGF0YWxpc3RcIihhZGRlZCBsYXRlcikuIFRoZXNlIHdlcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBpbiB0aGUgbWFpbiBydWxlLCBtaWdodCBuZWVkIHRvIHJlZmFjdG9yIHRoZSBjb2RlIGxhdGVyXG5cbiAgICAgICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAmJiBDb21tb25VdGlsLmlzRmlyc3RGb3JtRWxlbWVudChwYXJlbnROb2RlLCBlbGVtZW50KSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudENsb25lID0gcGFyZW50Tm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBleGNsdWRlIGFsbCBmb3JtIGVsZW1lbnRzIGZyb20gdGhlIGxhYmVsIHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBoYXZlIGlubmVyIGNvbnRlbnRcbiAgICAgICAgICAgIHBhcmVudENsb25lID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHBhcmVudENsb25lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgaW1wbGljaXQgbGFiZWwgb2YgdGhlIGdpdmVuIGZvcm0gZmllbGRcbiAgICBwdWJsaWMgc3RhdGljIGdldEltcGxpY2l0TGFiZWwoZWxlbWVudCkge1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgXCJsYWJlbFwiKTtcbiAgICAgICAgLy8gVGVzdCAgYSkgaWYgdGhlIHBhcmVudCBpcyBhIGxhYmVsIHdoaWNoIGlzIHRoZSBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAvLyAgICAgICBiKSBpZiB0aGUgZm9ybSBlbGVtZW50IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYykgaWYgdGhlIGZvcm0gZWxlbWVudCByZXF1aXJlcyBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCA6IFwiaW5wdXRcIiwgIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCJcbiAgICAgICAgLy8gICAgICAgZCkgZm9ybSBlbGVtZW50cyB3aGljaCBtYXkgaGF2ZSBhIGxhYmVsOiBidXR0b25cbiAgICAgICAgLy8gZm9ybSBlbGVtZW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIGltcGxpY2l0IG9yIGV4cGxpY2l0IGxhYmVsIGVsZW1lbnQgYXJlOlxuICAgICAgICAvLyBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZGF0YWxpc3RcIihhZGRlZCBsYXRlcikuIFRoZXNlIHdlcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBpbiB0aGUgbWFpbiBydWxlLCBtaWdodCBuZWVkIHRvIHJlZmFjdG9yIHRoZSBjb2RlIGxhdGVyXG5cbiAgICAgICAgaWYgKHBhcmVudE5vZGUgJiYgcGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAmJiBDb21tb25VdGlsLmlzRmlyc3RGb3JtRWxlbWVudChwYXJlbnROb2RlLCBlbGVtZW50KSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudENsb25lID0gcGFyZW50Tm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBleGNsdWRlIGFsbCBmb3JtIGVsZW1lbnRzIGZyb20gdGhlIGxhYmVsIHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBoYXZlIGlubmVyIGNvbnRlbnRcbiAgICAgICAgICAgIHBhcmVudENsb25lID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChwYXJlbnRDbG9uZSk7XG4gICAgICAgICAgICByZXR1cm4gbGFiZWwgJiYgbGFiZWwudHJpbSgpICE9PSAnJyA/IGxhYmVsLnRyaW0oKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgbGFiZWwgZm9yIGEgZm9ybSBmaWVsZCBlbGVtZW50LlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IGZyb20gd2hpY2ggdG8gZ2V0IHRoZSBsYWJlbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGV4dCAtIHJldHVybiB0aGUgbGFiZWwgdGV4dCBvciBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEZvcm1GaWVsZExhYmVsKGVsZW0pIDogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIC8vIGdldCB0aGUgbGFiZWwgZnJvbSB0aGUgYXR0cmlidXRlIFwiZm9yXCIgb2YgdGhlIGxhYmVsIGVsZW1lbnRcbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCB2YWx1ZSA9IFwiXCI7XG4gICAgICAgIGxldCBsYWJlbCA9IG51bGw7XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtLCB0cnVlKTtcbiAgICAgICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgLy8gdmFsdWUgZGlyZWN0bHkgZnJvbSBlbGVtZW50IHRleHRcbiAgICAgICAgICAgIGxhYmVsID0gbGFiZWxFbGVtLmlubmVyVGV4dDsgLy8gaWdub3JlIGhpZGRlbiB0ZXh0XG4gICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgLyoqIGlmIGl0J3Mgbm90IGxhYmVsIHdpdGggZm9yIGF0dHJpYnV0ZSwgdGhlbiBmaW5kIGltcGxpY2l0IGxhYmVsXG4gICAgICAgICAgICAgKiBjYXNlcyBmb3IgZXhwbGljdCBsYWJlbDogXG4gICAgICAgICAgICAgKiAgIDxsYWJlbCBmb3I9J215Jz48L2xhYmVsPjxpbnB1dCBpZD0nbXknLz5cbiAgICAgICAgICAgICAqICAgPGxhYmVsIGZvcj0nbXknPjxpbnB1dCBpZD0nbXknLz48L2xhYmVsPiAgIFxuICAgICAgICAgICAgICogY2FzZXMgZm9yIGltcGxpY2l0IGxhYmVsOiBcbiAgICAgICAgICAgICAqICAgIDxsYWJlbD48aW5wdXQgLz48L2xhYmVsPlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW0sIFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAobGFiZWxFbGVtICYmIGxhYmVsRWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibGFiZWxcIiAmJiBDb21tb25VdGlsLmlzRmlyc3RGb3JtRWxlbWVudChsYWJlbEVsZW0sIGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudENsb25lID0gbGFiZWxFbGVtLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAvLyBleGNsdWRlIGFsbCB0aGUgdGV4dCBmcm9tIHRoZSBmaXJzdCBmb3JtIGVsZW1lbnQgc2luY2UgdGhleSBtaWdodCBhbHNvIFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgaW5uZXIgY29udGVudCB0aGF0IGlzIHBhcnQgb2YgaW5uZXJUZXh0XG4gICAgICAgICAgICAgICAgcGFyZW50Q2xvbmUgPSBDb21tb25VdGlsLnJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChwYXJlbnRDbG9uZSk7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChwYXJlbnRDbG9uZSk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgIHZhbHVlICs9IGxhYmVsLnRyaW0oKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHZhbHVlIGZyb20gY2hpbGQgZWxlbWVudCBhdHRyaWJ1dGVcbiAgICAgICAgbGFiZWwgPSBDb21tb25VdGlsLmdldExhYmVsVGV4dEZyb21BdHRyaWJ1dGUobGFiZWxFbGVtLCB0cnVlKTtcbiAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgIHZhbHVlICs9IGxhYmVsLnRyaW0oKTtcblxuICAgICAgICAvLyB3aXJlZCBjYXNlOiBnZXQgYXJpYSBsYWJlbCBmcm9tIGxhYmVsIGVsZW1lbnQgaXRzZWxmIGp1c3QgaW4gY2FzZSAodGhvdWdoIG5hbWUgcHJvaGliaXRlZCBmcm9tIGFyaWEgaW4gaHRtbClcbiAgICAgICAgbGFiZWwgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwobGFiZWxFbGVtKTtcbiAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgIHZhbHVlICs9IGxhYmVsLnRyaW0oKTtcblxuICAgICAgICByZXR1cm4gdmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNhbGN1bGF0ZSBsYWJlbCBmcm9tIGVtYmVkZGVkIGNvbnRyb2w6IGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9hY2NuYW1lL1xuICAgICAqIEBwYXJhbSB7ZWxlbWVudH0gbGFiZWxFbGVtIGxhYmVsIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggbGFiZWwgc2hvdWxkIGJlIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZCAgXG4gICAgICogQHJldHVybnMgbGFiZWwgdGV4dCBvciAnJ1xuICAgICAqIFxuICAgICAqIG5vdGUgdGhlIGFzc3VtcHRpb24gaXMgdGhlIGxhYmVsRWxlbSByZWZlcnMgZWl0aGVyIHRvIGEgbGFiZWxsZWQgZWxlbWVudCBieSAnZm9yJyBhdHRyaWJ1dGUgXG4gICAgICogIG9yIGl0cyBmaXJzdCBmb3JtIGZpZWxkIGlzIGxhYmJlbGxlZCBlbGVtZW50XG4gICAgICovIFxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFiZWxUZXh0RnJvbUF0dHJpYnV0ZShsYWJlbEVsZW06IEVsZW1lbnQsIGlnbm9yZUhpZGRlbjogYm9vbGVhbikgOiBzdHJpbmcge1xuICAgICAgICAvLyBsYWJlbCBlaXRoZXIgcG9pbnRzIHRvIGEgbGFiZWxhYmxlIGVsZW1lbnQgYnkgaXRzIGZvciBhdHRyaWJ1dGUgb3IgdGhlIGZpcnN0IGVsZW1lbnQgY2hpbGRcbiAgICAgICAgLy8gZ2V0IHRoZSBsYWJlbGxlZCBlbG1lbnQgaWYgaXQncyBhbiBpbXBsaWNpdCBsYWJlbFxuICAgICAgICBsZXQgbGFiZWxlZEVsZW0gPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsYWJlbEVsZW0uY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkOiBFbGVtZW50ID0gbGFiZWxFbGVtLmNoaWxkcmVuLml0ZW0oaSk7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmNsdWRlcyhjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgIGxhYmVsZWRFbGVtID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIobGFiZWxFbGVtKTtcbiAgICAgICAgbGV0IHRleHQgPSAnJztcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPT0gbGFiZWxFbGVtKSB7XG4gICAgICAgICAgICAvLyBvbmx5IGNoZWNrIGVsZW1lbnQgY2hpbGRyZW5cbiAgICAgICAgICAgIGlmIChudy5ub2RlICYmIG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgbncuZWxlbSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG53LmVsZW0oKTtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgaXQncyBoaWRkZW4sIG9yIGxhYmVsbGVkIGVsZW1lbnQsIG9yIGZpcnN0IGZvcm0gZWxlbWVudCBpZiBub3QgbGFiZWxlZCBieSBmb3IgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gJiYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGVsZW0pIHx8IFZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoZWxlbSkpKVxuICAgICAgICAgICAgICAgICAgICB8fCAobGFiZWxlZEVsZW0gJiYgbGFiZWxlZEVsZW0uY29udGFpbnMoZWxlbSkpKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgLy8gdGV4dGJveCBldGMuIHJldHVybiBpdHMgdGV4dCB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRleHRib3hcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgJiYgbmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJyAnICsgbmFtZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgPT09IFwiY29tYm9ib3hcIiB8fCByb2xlID09PSBcImxpc3Rib3hcIikgeyBcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGNvbWJvYm94IG9yIGxpc3Rib3ggcm9sZXMsIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY2hvc2VuIG9wdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZE9wdGlvbiA9IGVsZW0ub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxlY3RlZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbiAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBzZWxlY3RlZE9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHNlbGVjdGVkT3B0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJyAnICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoW1wicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCIsIFwibWV0ZXJcIl0uaW5jbHVkZXMocm9sZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJhbmdlIHJvbGUgdHlwZSwgaW5jbHVkaW5nIFwicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCIgcm9sZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFyaWEtdmFsdWV0ZXh0IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJyAnICsgdmFsdWUudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGFyaWEtdmFsdWVub3cgcHJvcGVydHkgaXMgcHJlc2VudCwgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVub3dcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbGx5IHVzZSBuYXRpdmUgdmFsdWUgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJyAnICsgdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGdldCBhcmlhIGxhYmVsIGZyb20gdGhlIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpICE9PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnRyaW0oKTsgICAgXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkge1xuICAgICAgICAvL2xldCBmb3JtRWxlbWVudHNSZXF1aXJpbmdMYWJlbCA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCJdO1xuICAgICAgICBpZiAocGFyZW50Tm9kZS5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5zaGFkb3dSb290KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3cgdHJlZVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgICAgICogQHBhcmFtIGlkU3RyIFxuICAgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSWRSZWZlclRvU2VsZihlbGVtZW50LCBpZFN0cjogU3RyaW5nKSB7XG4gICAgICAgIGlmICghaWRTdHIgfHwgaWRTdHIudHJpbSgpID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaWRzID0gaWRTdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGlkcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHJlZmVycmVkTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkc1tqXSk7XG4gICAgICAgICAgICBpZiAocmVmZXJyZWROb2RlICYmIERPTVV0aWwuc2FtZU5vZGUocmVmZXJyZWROb2RlLCBlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgYXR0clN0cikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0clN0cikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0clN0cikudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZnJhbWUsIG51bGwgaWYgbm90IGZvdW5kICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCwgZnJhbWVOYW1lKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBsZXQgZnJhbWVMaXN0ID0gW3dpbmRvd107XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICB3aGlsZSAoaWR4IDwgZnJhbWVMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0ubmFtZSA9PT0gZnJhbWVOYW1lKSByZXR1cm4gZnJhbWVMaXN0W2lkeF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUxpc3RbaWR4XS5mcmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBpdCdzIGEgcmVhbCBmcmFtZSBhbmQgYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldICYmICFmcmFtZUxpc3QuaW5jbHVkZXMoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGlzdC5wdXNoKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0TlNSZXNvbHZlcihwcmVmaXgpIHtcbiAgICAgICAgbGV0IHVyaTtcbiAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3gyJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwyJztcbiAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3hodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICAvL2NoZWNraW5nIGlmIG9ubHkgdGhlIGlubmVyIHRleHQgaXMgZW1wdHkgb3Igbm90XG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dE9ubHlFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG5cbiAgICAgICAgaWYgKCh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3Nsb3QnICYmIGVsZW1lbnQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9pZ25vcmUgc2xvdCBiZWNhdXNlIGl0cyB0ZXh0IHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgaW4gdGhlIGxpZ2h0IERPTSBcbiAgICAgICAgICAgIC8vIGlubmVyVGV4dCBpcyBzb21ldGltZXMgJ3VuZGVmaW5lZCcgaW4gaGVhZGxlc3MgbW9kZSwgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBpbnZpc2libGUgb3Igbm90IGVyeHBhbmRlZCBcbiAgICAgICAgICAgIC8vIHNvIHdlIHRyeSB0ZXh0Q29udGVudCBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gISh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiKSB7XG4gICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY29uc2lkZSBpdHMgb3duIGNvbnRlbnQsIGEgc2xvdCBtYXkgaGF2ZSBpdHMgb3duIGNvbnRlbnQgb3IgYXNzaWduZWQgY29udGVudFxuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90RWxlbSBvZiBlbGVtZW50LmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAmJiBDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkoc2xvdEVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiB0aGUgaW5uZXIgdGV4dCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICBpZiAocmV0VmFsID09PSB1bmRlZmluZWQgfHwgcmV0VmFsID09PSBudWxsIHx8IHJldFZhbC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICByZXRWYWwgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBvbnNjcmVlbiBpbm5lclRleHQuXG4gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBhcyBpbm5lclRleHQgaWYgbm8gb2Zmc2NyZWVuIGNvbnRlbnQgZXhpc3RzXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7bnVsbCB8IHN0cmluZ30gbnVsbCBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCB0ZXh0IG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRPblNjcmVlbklubmVyVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSAzKSByZXR1cm4gZWxlbWVudC5ub2RlVmFsdWUoKTtcblxuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIC8vbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCB0byBnZXQgdGhlIHRleHRcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPT0gZWxlbWVudCAmJiBudy5ub2RlICE9PSBlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChudy5iRW5kVGFnKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICgobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAoVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmNsdWRlcyhudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSkge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVUeXBlID09PSAzICYmIG53Lm5vZGUubmV4dFNpYmxpbmcubm9kZVZhbHVlICE9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbncubm9kZSA9IG53Lm5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAzICYmIG53Lm5vZGUubm9kZVZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7IFxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgLyoqIFJldHVybiB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBnaXZlbiBub2RlIFxuICAgICAqICB0aGlzIGlzIGRpZmZlcmVudCB0aGFuIGlubmVyVGV4dCBvciB0ZXh0Q29udGVudCB0aGF0IHJldHVybiB0ZXh0IGNvbnRlbnQgb2YgYSBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHNcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Tm9kZVRleHQoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBcIlwiO1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChjaGlsZE5vZGVzW2ldLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IGNoaWxkTm9kZXNbaV0ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGlmIGVsZW1lbnRzIGlubmVyIHRleHQgaXMgZW1wdHkgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaXQgaGFzIGlubmVyIHRleHQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgZWxlbWVudCBoYXMgZW1wdHkgaW5uZXIgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSW5uZXJUZXh0RW1wdHkoZWxlbWVudCkge1xuICAgICAgICAvLyBHZXQgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudFxuICAgICAgICBsZXQgdGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIFRyaW0gdGhlIGlubmVyIHRleHQgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCBlbXB0eS5cbiAgICAgICAgcmV0dXJuICEodGV4dCAhPSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChlbGVtZW50KTtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSAodGV4dCAhPT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvL2xldCBudyA9IG5ldyBOb2RlV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghaGFzQ29udGVudCAmJiBudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW1nXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcImFsdFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5lIGlmIGFuIGVsZW1lbnQgaGFzIGlubmVyIGNvbnRlbnQuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNvbnNpZGVycyBjYXNlcyB3aGVyZSBpbm5lciB0ZXh0IGlzIGhpZGRlbiwgd2hpY2ggbm93IHdpbGxcbiAgICAgKiBiZSBjbGFzc2lmaWVkIGFzIGRvZXMgbm90IGhhdmUgaGlkZGVuIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHN2Z0hhc05hbWUoZWxlbWVudDogU1ZHRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxcIilcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsbGVkYnlcIilcbiAgICAgICAgICAgIHx8ICEhZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiOnNjb3BlID4gdGl0bGVcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRIaWRkZW5IeXBlckxpbmsoZWxlbWVudCwgaHlwZXJsaW5rX2ZsYWcpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBjaGlsZEVsZW1lbnQgPSBlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICBsZXQgaGFzQ29udGVudCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGNoaWxkRWxlbWVudCBpcyBub3QgbnVsbCB0aGVuIHdlIG5lZWQgdG8gY2hlY2sgZWFjaCBvZiB0aGUgZWxlbWVudHNcbiAgICAgICAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGVsZW1lbnRzIGFyZSBub3QgYWxsIGhpZGRlbi5cbiAgICAgICAgaWYgKGNoaWxkRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGV3YWx0ZXIgb2YgdGhlIGVsZW1lbnQgbm9kZSwgc28gdGhhdCB3ZSBjYW4gbG9vcCBvdmVyIGl0IGFuZCB2ZXJpZnlcbiAgICAgICAgICAgIC8vIHRoYXQgdGhlIGVsZW1lbnRzIHVuZGVyIHRoZSBlbGVtZW50IGFyZSBub3QgY29tcGxldGx5IGhpZGRlbi5cbiAgICAgICAgICAgIC8vbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIENvbW1vblV0aWwuc3ZnSGFzTmFtZShub2RlIGFzIGFueSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy9sZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgKEFyaWFVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIiwgdHJ1ZSkgfHwgQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCBcInRleHRib3hcIikpXG4gICAgICAgICAgICAgICAgICAgICYmIChBcmlhVXRpbC5oYXNBcmlhTGFiZWwobncubm9kZSkgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcInRpdGxlXCIpIHx8IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKG53LmVsZW0oKSwgdHJ1ZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDb250ZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29uY2F0VW5pcXVlQXJyYXlJdGVtKGl0ZW06IHN0cmluZywgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgYXJyLmluZGV4T2YoaXRlbSkgPT09IC0xICYmIGl0ZW0gIT09IG51bGwgPyBhcnIucHVzaChpdGVtKSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpdGVtTGlzdCAhPT0gbnVsbCAmJiBpIDwgaXRlbUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyciA9IENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtKGl0ZW1MaXN0W2ldLCBhcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVtb3ZlIGFycmF5IGl0ZW1zIGZyb20gYSBnaXZlbiBhcnJheVxuICAgICAqIEBwYXJhbSBpdGVtTGlzdCBpdGVtcyB0byBiZSByZW1vdmVkIGZyb20gYXJyXG4gICAgICogQHBhcmFtIGFyciB0aGUgYXJyYXlcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJlZHVjZUFycmF5SXRlbUxpc3QoaXRlbUxpc3Q6IHN0cmluZ1tdLCBhcnI6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBpZiAoYXJyICYmIGFyci5sZW5ndGggPiAwICYmIGl0ZW1MaXN0ICYmIGl0ZW1MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhcnIuZmlsdGVyKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhaXRlbUxpc3QuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRTY29wZUZvclRoKGVsZW1lbnQpIHtcbiAgICAgICAgLyoqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS90YWJ1bGFyLWRhdGEuaHRtbCNoZWFkZXItYW5kLWRhdGEtY2VsbC1zZW1hbnRpY3NcbiAgICAgICAgICogQSBoZWFkZXIgY2VsbCBhbmNob3JlZCBhdCB0aGUgc2xvdCB3aXRoIGNvb3JkaW5hdGUgKHgsIHkpIHdpdGggd2lkdGggd2lkdGggYW5kIGhlaWdodCBoZWlnaHQgaXMgXG4gICAgICAgICAqIHNhaWQgdG8gYmUgYSBjb2x1bW4gaGVhZGVyIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGNvbHVtbiBzdGF0ZSwgb3JcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgYXV0byBzdGF0ZSwgYW5kIHRoZXJlIGFyZSBubyBkYXRhIGNlbGxzIGluIGFueSBvZiBcbiAgICAgICAgICogICB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB5LWNvb3JkaW5hdGVzIHkgLi4geStoZWlnaHQtMS5cbiAgICAgICAgICogQSBoZWFkZXIgY2VsbCBhbmNob3JlZCBhdCB0aGUgc2xvdCB3aXRoIGNvb3JkaW5hdGUgKHgsIHkpIHdpdGggd2lkdGggd2lkdGggYW5kIGhlaWdodCBoZWlnaHQgaXNcbiAgICAgICAgICogc2FpZCB0byBiZSBhIHJvdyBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgcm93IHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCB0aGUgY2VsbCBpcyBub3QgYSBjb2x1bW4gaGVhZGVyLCBhbmQgdGhlcmUgYXJlXG4gICAgICAgICAqICAgbm8gZGF0YSBjZWxscyBpbiBhbnkgb2YgdGhlIGNlbGxzIGNvdmVyaW5nIHNsb3RzIHdpdGggeC1jb29yZGluYXRlcyB4IC4uIHgrd2lkdGgtMS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIE5vdGU6IGF1dG8gaXMgZGVmYXVsdCBzY29wZVxuXG4gICAgICAgIC8vIEVhc2llc3QgYW5zd2VyIGlzIGlmIHNjb3BlIGlzIHNwZWNpZmllZFxuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJzY29wZVwiKSkge1xuICAgICAgICAgICAgbGV0IHNjb3BlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcInJvd1wiIHx8IHNjb3BlID09PSAncm93Z3JvdXAnKSByZXR1cm4gXCJyb3dcIjtcbiAgICAgICAgICAgIGlmIChzY29wZSA9PT0gXCJjb2xcIiB8fCBzY29wZSA9PT0gJ2NvbGdyb3VwJykgcmV0dXJuIFwiY29sdW1uXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzY29wZSBpcyBhdXRvLCBkZWZhdWx0ICh3aXRob3V0IGEgc2NvcGUpIG9yIGludmFsaWQgdmFsdWUuXG4gICAgICAgIC8vIGlmIGFsbCB0aGUgc2libGluZyBlbGVtZW50cyBhcmUgdGgsIHRoZW4gcmV0dXJuIFwiY29sdW1uaGVhZGVyXCIgXG4gICAgICAgIHZhciBzaWJsaW5ncyA9IGVsZW1lbnQgPT4gWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUgIT0gXCJUSFwiKTtcbiAgICAgICAgaWYgKHNpYmxpbmdzID09PSBudWxsIHx8IHNpYmxpbmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBcImNvbHVtblwiO1xuICAgICAgICBlbHNlIHJldHVybiBcInJvd1wiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbE9mTGFiZWwobm9kZTogTm9kZSkge1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGVhc3kgY2FzZSBvZiBsYWJlbCAtPiBmb3JcbiAgICAgICAgbGV0IGxhYmVsQW5jZXN0b3IgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKG5vZGUsIFwibGFiZWxcIik7XG4gICAgICAgIGlmIChsYWJlbEFuY2VzdG9yKSB7XG4gICAgICAgICAgICBpZiAobGFiZWxBbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJmb3JcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnJhZ21lbnRVdGlsLmdldEJ5SWQobm9kZSwgbGFiZWxBbmNlc3Rvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGlkcyBvZiBwYXJlbnQgbm9kZXNcbiAgICAgICAgbGV0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIik7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGlucHV0c1VzaW5nTGFiZWxsZWRCeS5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFVzaW5nTGFiZWxsZWRCeSA9IGlucHV0c1VzaW5nTGFiZWxsZWRCeVtpZHhdO1xuICAgICAgICAgICAgY29uc3QgYXJpYUxhYmVsbGVkQnkgPSBpbnB1dFVzaW5nTGFiZWxsZWRCeS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIik7XG4gICAgICAgICAgICBjb25zdCBzcCA9IGFyaWFMYWJlbGxlZEJ5LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygc3ApIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQgaW4gaWREaWN0ICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihub2RlLCAobm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dFVzaW5nTGFiZWxsZWRCeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kIHRoZSBjYXNlcyB3aGVyZSB3ZSdyZSB3aXRoaW4gYW4gYXJpYSBsYWJlbGxlZGJ5XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIHRoYXQgaXMgcHJvdmllZCBpc1xuICAgICAqIGRpc2FibGVkIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgZGlzYWJsZWQgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4gICAgICogICAgICAgYXR0cmlidXRlIC0tPiBkaXNhYmxlZFxuICAgICAqICAgICAgICAgQWxzbyBuZWVkcyB0byBiZSBcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLFxuICAgICAqICAgICAgICAgXCJtZW51aXRlbVwiLCBcImZpZWxkc2V0XCIgbm9kZXMgKGluIGFycmF5IGVsZW1lbnRzQWxsb3dlZERpc2FibGVkKVxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gYXJpYS1kaXNhYmxlZD1cInRydWVcIlxuICAgICAqICAgIDIuIENoZWNrIGlmIGFueSBvZiB0aGUgY3VycmVudCBub2RlcyBwYXJlbnRzIGFyZSBkaXNhYmxlZCB3aXRoIHRoZSBzYW1lXG4gICAgICogICAgICAgb3B0aW9ucyBsaXN0ZWQgaW4gMS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IElmIGVpdGhlciBjdXJyZW50IG5vZGUgb3IgYW55IG9mIHRoZSBwYXJlbnQgbm9kZXMgYXJlIGRpc2FibGVkIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRydWUgKG5vZGUgaXMgZGlzYWJsZWQpLlxuICAgICAqXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgZGlzYWJsZWQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgZGlzYWJsZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVEaXNhYmxlZChub2RlKSB7XG5cbiAgICAgICAgLy8gU2V0IFBUX05PREVfRElTQUJMRUQgdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBkaXNhYmxlZC4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBub2RlIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC4gT25seSBzZXQgaXQgdG8gZmFsc2UgaWYgdGhlIHNldHRpbmcgaXMgdW5kZWZpbmVkIG9yIG51bGxcbiAgICAgICAgLy8gYXMgaWYgaXQgaXMgZGVmaW5lZCB3ZSBkbyBub3Qgd25hdCB0byByZXNldCBpdC4gQXMgaWYgaXQgaXMgdHJ1ZSB0aGVuIHdlIHNob3VsZCBtYWtlIHVzZSBvZiBpdFxuICAgICAgICAvLyB0byBzcGVlZCB1cCB0aGUgY2hlY2suXG4gICAgICAgIGxldCBQVF9OT0RFX0RJU0FCTEVEID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ESVNBQkxFRFwiLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgdGhlIG5vZGVUeXBlIG9mIHRoaXMgbm9kZSwgaWYgdGhpcyBub2RlIGlzIGEgdGV4dCBub2RlIHRoZW5cbiAgICAgICAgLy8gd2UgZ2V0IHRoZSBwYXJlbnRub2RlIGFuZCBzZXQgdGhhdCBhcyB0aGUgbm9kZSBhcyBhIHRleHQgbm9kZXMsXG4gICAgICAgIC8vIGRpc2FibGVkIGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHBhcmVudCBub2RlLlxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZGlzYWJsZWQgZWxlbWVudCBwcm9wZXJ0eSwgZGlzYWJsZWQgYW5kIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIGFuZCBjaGVjayB0aGF0IGl0IGlzIHRydWVcbiAgICAgICAgbGV0IGRpc2FibGVkQXR0cmlidXRlID0gbm9kZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgbGV0IGRpc2FibGVkUHJvcGVydHlDdXN0b20gPSBQVF9OT0RFX0RJU0FCTEVEO1xuICAgICAgICBsZXQgYXJpYURpc2FibGVkQXR0cmlidXRlID0gbm9kZS5oYXNBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSAmJiBub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtZGlzYWJsZWRcIikgPT09ICd0cnVlJztcblxuICAgICAgICAvLyBJZiB0aGlzIG5vZGUgaGFzIGRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgdGhlIG5vZGUgYWxsb3dzIGRpc2FibGVkIGF0dHJpYnV0ZSwgdGhlbiByZXR1cm4gdHJ1ZS5cbiAgICAgICAgLy8gRGlzYWJsZWQgYXR0cmlidXRlIGlzIG9ubHkgYWxsb3dlZCBvbiBcImJ1dHRvblwiLCBcImlucHV0XCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcIm1lbnVpdGVtXCIsIFwiZmllbGRzZXRcIlxuICAgICAgICAvLyBJbiB0aGUgY2FzZSBhcmlhLWRpc2FibGVkIGlzIHNldCB0byB0cnVlLCB0aGVuIGFsc28gcmV0dXJuIHRydWVcbiAgICAgICAgaWYgKGRpc2FibGVkUHJvcGVydHlDdXN0b20gfHwgKGRpc2FibGVkQXR0cmlidXRlICYmIEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWREaXNhYmxlZC5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSB8fCBhcmlhRGlzYWJsZWRBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ESVNBQkxFRFwiLCBQVF9OT0RFX0RJU0FCTEVEKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlIGZvciB0aGlzIG5vZGUsIGJlY3Vhc2Ugd2UgaGF2ZSB0byBjaGVjayBhbGwgcGFyZW50cyB0byBtYWtlIHN1cmUgdGhleSBkbyBub3QgaGF2ZVxuICAgICAgICAvLyBkaXNhYmxlZCBhdHRyaWJ1dGUuIE9ubHkga2VlcCBjaGVja2luZyB1bnRpbCB3ZSBhcmUgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgbm9kZSBleGlzdHMgYW5kIHRoZSBub2RldHlwZSBpcyBlbGVtZW50ICgxKSwgdGhlbiBydW4gcmVjdXJzaXZlIGNhbGwgdG8gcGVyZm9ybSB0aGUgY2hlY2tcbiAgICAgICAgLy8gYWxsIHRoZSB3YXkgdXAgdG8gdGhlIHZlcnkgcGFyZW50IG5vZGUuIFVzZSByZWN1cnNpdmUgY2FsbCBoZXJlIGluc3RlYWQgb2YgYSB3aGlsZSBsb29wIHNvIHRoYXQgd2UgZG8gbm90XG4gICAgICAgIC8vIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgaXMgZGlzYWJsZWQgb3Igbm90IGZvciBhbGwgdGhlIHBhcmVudHMgc3RhcnRpbmcgd2l0aFxuICAgICAgICAvLyBjaGlsZCBub2RlLlxuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsICYmIHBhcmVudEVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZURpc2FibGVkID0gQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChwYXJlbnRFbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgZm91bmQgdG8gYmUgZGlzYWJsZWQgdGhlbiBhZGQgdGhlIGN1c3RvbSBQVF9OT0RFX0RJU0FCTEVEIHRvIHRydWUuXG4gICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyBuZXh0IHRpbWUsIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIG5vZGUgaXMgZGlzYWJsZWQgb3Igbm90LlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBleHRyYSBwZXJjYXV0aW9uLCB0aGUgaXNOb2RlRGlzYWJsZWQgZnVuY3Rpb24gYWxyZWFkeSBzZXRzIHRoaXMuXG4gICAgICAgICAgICBpZiAobm9kZURpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgUFRfTk9ERV9ESVNBQkxFRCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgUFRfTk9ERV9ESVNBQkxFRCk7XG4gICAgICAgICAgICByZXR1cm4gbm9kZURpc2FibGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCBkaXNhYmxlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluZSBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgYmUgY2hlY2tlZFxuICAgICAqIGluIHJ1bGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgLSBBIG5vZGUgc28gdGhhdCB0aGUgZG9jdW1lbnQgY2FuIGJlIGFjY2Vzc2VkIHRvIGNoZWNrIGZvciB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbi4gQ2FuIGJlIGRvY3VtZW50IGVsZW1lbnQgb3IgYSBzaW1wbGUgbm9kZSBlbGVtZW50LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGRDaGVja0hpZGRlbkNvbnRlbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgaWYgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBmcm9tIGNoZWNraW5nIG9yIG5vdCwgYmFzZWRcbiAgICAgKiBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZ3MgYW5kIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgLSBOb2RlIHRvIGNoZWNrIGlmIGl0IGlzIHZpc2libGUgb3Igbm90IGJhc2VkIG9uIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4obm9kZSkge1xuICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZVxuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWUgdG8gaWRlbnRpZnkgdGhhdCB0aGUgbm9kZSBzaG91bGQgbm90IGJlIHNjYW5uZWQvYWRkZWQgdG8gYW55IGhhc2gvYXJyYXkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICBpZiAoIUNvbW1vblV0aWwuc2hvdWxkQ2hlY2tIaWRkZW5Db250ZW50KG5vZGUpICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNmb2N1c2FibGVCeURlZmF1bHQobm9kZSkge1xuICAgICAgICB2YXIgZm9jdXNhYmxlRWxlbWVudHMgPSBbJ2lucHV0JywgJ3NlbGVjdCcsICdidXR0b24nLCAndGV4dGFyZWEnLCAnb3B0aW9uJywgJ2FyZWEnXTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhXCIgJiYgQ29tbW9uVXRpbC5oYXNBdHRyaWJ1dGUobm9kZSwgJ2hyZWYnKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYXJlYVwiICYmIENvbW1vblV0aWwuaGFzQXR0cmlidXRlKG5vZGUsICdocmVmJykpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZm9jdXNhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpICE9PSAtMSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrIGlmIGEgbm9uLXRhYmFibGUgbm9kZSBoYXMgdmFsaWQgdGFiYWJsZSBjb250ZW50LlxuICAgICAqIElmIGl0IGlzIHRhYmFibGUgKHRoZSB0YWJpbmRleCBpcyBub3Qgc3BlaWNpZmllZCBvciBpcyBub3QgLTEpLCByZXR1cm5zIGZhbHNlO1xuICAgICAqIElmIGl0IGlzIG5vbi10YWJhYmxlLCBidXQgYSBjaGlsZCBpcyB0YWJhYmxlIGFuZCBkb2VzIG5vdCBoYXZlIGVsZW1lbnQgY29udGVudCwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgdHJ1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIG5vblRhYmFibGVDaGlsZENoZWNrKGVsZW1lbnQ6IEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpIHx8XG4gICAgICAgICAgICAocGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgIT0gLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy9sZXQgbncgPSBuZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IG53LmVsZW0oKTtcbiAgICAgICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkgeyAvLyBUZXh0IG5vZGUuIHVzdWFsbHkgaXMgYSBjYXJ0cmlkZ2UgcmV0dXJuLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoaWxkLmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpICYmXG4gICAgICAgICAgICAgICAgKHBhcnNlSW50KGNoaWxkLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSAhPSAtMSkgJiZcbiAgICAgICAgICAgICAgICAhQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgdmFyIGhhc0F0dHJpYnV0ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIGhhc0F0dHJpYnV0ZSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuYXR0cmlidXRlcyAmJiBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKSB7XG4gICAgICAgICAgICB2YXIgYXR0ciA9IGVsZW1lbnQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBhdHRyICYmIGF0dHIuc3BlY2lmaWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgLy8gdHJ1bmNhdGUgdGhlIGdpdmVuIHRleHQgdG8gYSBnaXZlbiBudW1iZXIgb2YgY2hhcmFjdGVyc1xuICAgIC8vIHJldHVybiB0cnVuY2F0ZWQgdGV4dCB0byAxNTAgY2hhcnMsIHNhbWUgd2l0aCB0aGUgbWVkaWFfYWx0X2JyaWVmIHJ1bGVcbiAgICBwdWJsaWMgc3RhdGljIHRydW5jYXRlVGV4dCh0ZXh0OiBzdHJpbmcsIGxlbiA9IDE1MCkge1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xuICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+IGxlbilcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBsZW4tMSkgK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuXG4gICAgfVxuXG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7UnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZVV0aWwge1xuXG4gICAgcHVibGljIHN0YXRpYyBpc0RhdGFUYWJsZSh0YWJsZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuICEoQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJwcmVzZW50YXRpb25cIikpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQSBjb21wbGV4IGRhdGEgdGFibGUgaXMgYSBkYXRhIHRhYmxlIHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOlxuICAgICAqXG4gICAgICogYSB0aGVhZCBlbGVtZW50IHRoYXQgY29udGFpbnMgdHdvIG9yIG1vcmUgdHIgZWxlbWVudHNcbiAgICAgKiBhIHRhYmxlIHdpdGggbW9yZSB0aGFuIG9uZSB0aGVhZCBlbGVtZW50XG4gICAgICogYSB0YWJsZSB3aXRoIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IHRoIGVsZW1lbnRzXG4gICAgICogYSB0aCBvciB0ZCBlbGVtZW50IHdpdGggYSByb3dzcGFuIG9yIGNvbHNwYW4gYXR0cmlidXRlXG4gICAgICogYSB0ciBlbGVtZW50IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRkIGVsZW1lbnQgYW5kIHR3byBvciBtb3JlIHRoIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIGhlYWRlcnMgbm90IGxvY2F0ZWQgaW4gdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW5cbiAgICAgKiBhIHRkIGVsZW1lbnQgd2l0aCBhIGhlYWRlcnMgYXR0cmlidXRlIHZhbHVlIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBJRFJFRnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29tcGxleERhdGFUYWJsZSh0YWJsZSkge1xuXG4gICAgICAgIGlmIChcIkFyaWFVdGlsX2lzQ29tcGxleERhdGFUYWJsZVwiIGluIHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gISF0YWJsZS5BcmlhVXRpbF9pc0NvbXBsZXhEYXRhVGFibGU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNDb21wbGV4VGFibGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGFibGUgJiYgVGFibGVVdGlsLmlzRGF0YVRhYmxlKHRhYmxlKSkge1xuXG4gICAgICAgICAgICBsZXQgdGhOb2RlcyA9IG51bGwsXG4gICAgICAgICAgICAgICAgdGROb2RlcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdHJOb2RlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIik7XG4gICAgICAgICAgICBsZXQgdHJOb2RlQ291bnQgPSB0ck5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0ZE5vZGVDb3VudCA9IDAsXG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRyTm9kZXNIYXZpbmdPbmx5VGhOb2RlcyA9IDA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhaXNDb21wbGV4VGFibGUgJiYgaSA8IHRyTm9kZUNvdW50OyArK2kpIHtcblxuICAgICAgICAgICAgICAgIHRoTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIik7XG4gICAgICAgICAgICAgICAgdGROb2RlcyA9IHRyTm9kZXNbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZFwiKTtcbiAgICAgICAgICAgICAgICB0aE5vZGVDb3VudCA9IHRoTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRkTm9kZUNvdW50ID0gdGROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGROb2RlQ291bnQgIT09IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRyIGVsZW1lbnQgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgdGQgZWxlbWVudCBhbmQgdHdvIG9yIG1vcmUgdGggZWxlbWVudHM7XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAxO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGggZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGogPCB0aE5vZGVDb3VudDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9ICgodGhOb2Rlc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhOb2Rlc1tqXS5oYXNBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IodGhOb2Rlc1tqXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ZCBlbGVtZW50IHdpdGggYSByb3dzcGFuIG9yIGNvbHNwYW4gYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgaGVhZGVycyBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBjb250YWlucyBtb3JlIHRoYW4gdHdvIElEUkVGc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGsgPCB0ZE5vZGVDb3VudDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9ICgodGROb2Rlc1trXS5oYXNBdHRyaWJ1dGUoXCJyb3dzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGROb2Rlc1trXS5oYXNBdHRyaWJ1dGUoXCJjb2xzcGFuXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSAmJiBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGROb2Rlc1trXS5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKS5zcGxpdChcIiBcIikubGVuZ3RoID4gMikpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih0ZE5vZGVzW2tdLCBcInRhYmxlXCIpID09PSB0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdHdvIG9yIG1vcmUgdHIgZWxlbWVudHMgdGhhdCBjb250YWluIG9ubHkgdGggZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoTm9kZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKyt0ck5vZGVzSGF2aW5nT25seVRoTm9kZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPT09IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzQ29tcGxleFRhYmxlKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgdGhlYWROb2RlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhlYWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXNMZW5ndGggPSB0aGVhZE5vZGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGVhZE5vZGVzTGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHRoZWFkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzTGVuZ3RoID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoZWFkIGVsZW1lbnQgdGhhdCBjb250YWlucyB0d28gb3IgbW9yZSB0ciBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29tcGxleFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoZWFkTm9kZXNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0clwiKS5sZW5ndGggPiAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSAmJiB0ck5vZGVDb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aE5vZGVDb3VudCA+IDAgJiYgIVRhYmxlVXRpbC50YWJsZUhlYWRlckV4aXN0cyh0YWJsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGFibGUuQXJpYVV0aWxfaXNDb21wbGV4RGF0YVRhYmxlID0gaXNDb21wbGV4VGFibGU7XG5cbiAgICAgICAgcmV0dXJuIGlzQ29tcGxleFRhYmxlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGEgdGFibGUgY2VsbCBpcyBoaWRkZW4gb3IgY29udGFpbiBubyBkYXRhOiA8dGQ+PC90ZD5cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVDZWxsRW1wdHkoY2VsbCkge1xuICAgICAgICBpZiAoIWNlbGwgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjZWxsKSB8fCBjZWxsLmlubmVySFRNTC5yZXBsYWNlKC8mbmJzcDsvZywnICcpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIHJvdyBpcyBoaWRkZW4gb3IgY29udGFpbiBubyBkYXRhOiA8dHIgLz4gb3IgPHRyPjx0ZD48L3RkPjx0ZD48L3RkPjwvdHI+IFxuICAgIHB1YmxpYyBzdGF0aWMgaXNUYWJsZVJvd0VtcHR5KHJvdykge1xuICAgICAgICBpZiAoIXJvdyB8fCAhcm93LmNlbGxzIHx8IHJvdy5jZWxscy5sZW5ndGggPT09IDAgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShyb3cpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTsgLy9lbXB0eVxuICAgICAgICBmb3IgKGxldCBjPTA7IHBhc3NlZCAmJiBjIDwgcm93LmNlbGxzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICBsZXQgY2VsbCA9IHJvdy5jZWxsc1tjXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFRhYmxlVXRpbC5pc1RhYmxlQ2VsbEVtcHR5KGNlbGwpOyAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHBhc3NlZDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlJ3MgaGVhZGVyIGlzIGluIHRoZSBmaXJzdCByb3cgb3IgY29sdW1uXG4gICAgcHVibGljIHN0YXRpYyB0YWJsZUhlYWRlckV4aXN0cyhydWxlQ29udGV4dCkge1xuXG4gICAgICAgIGxldCByb3dzID0gcnVsZUNvbnRleHQucm93cztcbiAgICAgICAgaWYgKCFyb3dzIHx8IHJvd3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gbm90ZSB0aGF0IHRhYmxlLnJvd3MgcmV0dXJuIGFsbCBhbGwgdGhlIHJvd3MgaW4gdGhlIHRhYmxlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSByb3dzIGNvbnRhaW5lZCB3aXRoaW4gPHRoZWFkPiwgPHRmb290PiwgYW5kIDx0Ym9keT4gZWxlbWVudHMuIFxuICAgICAgICBcbiAgICAgICAgLy9jYXNlIDE6IGhlYWRlcnMgYXJlIGluIHRoZSB2ZXJ5IGZpcnN0IHJvdyB3aXRoIGRhdGEgaW4gdGJvZHkgb3IgdGhlYWQsIGJ1dCBub3QgaW4gdGZvb3QgICBcbiAgICAgICAgLy9nZXQgdGhlIGZpcnN0IHJvdyB3aXRoIGRhdGEsIGlnbm9yaW5nIHRoZSByb3dzIHdpdGggbm8gZGF0YVxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGZpcnN0Um93ID0gcm93c1swXTtcbiAgICAgICAgZm9yIChsZXQgcj0wOyBwYXNzZWQgJiYgciA8IHJvd3MubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGZpcnN0Um93ID0gcm93c1tyXTtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcm93cyBmcm9tIHRmb290XG4gICAgICAgICAgICBpZiAoZmlyc3RSb3cucGFyZW50Tm9kZSAmJiBmaXJzdFJvdy5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0Zm9vdCcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBwYXNzZWQgPSBUYWJsZVV0aWwuaXNUYWJsZVJvd0VtcHR5KGZpcnN0Um93KTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vdGFibGUgY29udGFpbiBubyBkYXRhOiAgPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+PC90ZD48L3RyPjwvdGFibGU+IFxuICAgICAgICBpZiAocGFzc2VkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2VsbHMgd2l0aCBkYXRhIGluIHRoZSBmaXJzdCBkYXRhIHJvdyBhcmUgYWxsIFRIJ3NcbiAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgcj0wOyBwYXNzZWQgJiYgciA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQgY2VsbCA9IGZpcnN0Um93LmNlbGxzW3JdO1xuICAgICAgICAgICAgcGFzc2VkID0gVGFibGVVdGlsLmlzVGFibGVDZWxsRW1wdHkoY2VsbCkgfHwgY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnOyAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIENhc2UgMjogaGVhZGVycyBhcmUgaW4gdGhlIGZpcnN0IGNvbHVtbiB3aXRoIGRhdGFcbiAgICAgICAgLy8gQXNzdW1lIHRoYXQgdGhlIGZpcnN0IGNvbHVtbiBoYXMgYWxsIFRIJ3Mgb3IgYSBURCB3aXRob3V0IGRhdGEgaW4gdGhlIGZpcnN0IGNvbHVtbi5cbiAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgcm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgLy8gaWdub3JlIHRoZSByb3dzIGZyb20gdGZvb3RcbiAgICAgICAgICAgIGlmIChyb3dzW2ldLnBhcmVudE5vZGUgJiYgcm93c1tpXS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0Zm9vdCcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBJZiBubyBjZWxscyBpbiB0aGlzIHJvdywgb3Igbm8gZGF0YSBhdCBhbGwsIHRoYXQncyBva2F5IHRvby5cbiAgICAgICAgICAgIHBhc3NlZCA9ICFyb3dzW2ldLmNlbGxzIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxscy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgICAgICByb3dzW2ldLmNlbGxzWzBdLmlubmVySFRNTC50cmltKCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwidGRcIjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgXG4gICAgICAgIC8vY2FzZSAzOiBhbGwgdGQgZGF0YSBjZWxscyBoYXZlIGhlYWRlcnMgYXR0cmlidXRlcyB0aGF0IHBvaW50IHRvIHRoZSBpZCBvZiBhIHRoIGVsZW1lbnQgaW4gdGhlIHNhbWUgdGFibGUuIFxuICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS90YWJsZXMuaHRtbCNhdHRyaWJ1dGVzLWNvbW1vbi10by10ZC1hbmQtdGgtZWxlbWVudHNcbiAgICAgICAgcGFzc2VkID0gdHJ1ZTsgXG4gICAgICAgIGxldCB0aElkcyA9IFtdO1xuICAgICAgICBsZXQgdGRIZWFkZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQgcm93ID0gcm93c1tyXTsgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2VsbHMgd2l0aCBkYXRhIGluIHRoZSBsYXN0IGRhdGEgcm93IGFyZSBhbGwgVEgnc1xuICAgICAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgcm93LmNlbGxzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICAgICAgaWYgKFRhYmxlVXRpbC5pc1RhYmxlQ2VsbEVtcHR5KGNlbGwpKSBjb250aW51ZTsgXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykgfHwgY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpLnRyaW0oKS5zcGxpdChcIiBcIiksIHRkSGVhZGVycyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0aCcgJiYgY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykgJiYgY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShjZWxsLmdldEF0dHJpYnV0ZSgnaWQnKS50cmltKCksIHRoSWRzKTsgICAgXG4gICAgICAgICAgICB9ICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpIHsgLy8gYWxsIHRkIGVsZW1lbnRzIGhhdmUgaGVhZGVycywgdG8gZXhhbSBpZiB0aGUgaGVhZGVycyBwb2ludCB0byBhIHRoIGlkXG4gICAgICAgICAgICBpZiAodGhJZHMubGVuZ3RoID4gMCAmJiB0ZEhlYWRlcnMuZXZlcnkoaGVhZGVyID0+IHRoSWRzLmluY2x1ZGVzKGhlYWRlcikpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNMYXlvdXRUYWJsZSh0YWJsZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmhhc1JvbGUodGFibGVOb2RlLCBcInByZXNlbnRhdGlvblwiKSB8fCBBcmlhVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJub25lXCIpO1xuICAgIH1cblxuLyogXG4gKiBnZXQgY29uZmxpY3QgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGVzXG4gKiByZXR1cm46IGEgbGlzdCBvZiBBcmlhIGFuZCBIdG1sIGF0dHJpYnV0ZSBwYWlycyB0aGF0IGFyZSBjb25mbGljdFxuKi9cbnB1YmxpYyBzdGF0aWMgaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpIHtcbiAgICBpZiAoIWNvbnRleHRIaWVyYXJjaGllcykgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgcmV0dXJuIGNvbnRleHRIaWVyYXJjaGllc1tcImFyaWFcIl0uZmlsdGVyKGhpZXIgPT4gW1widGFibGVcIiwgXCJncmlkXCIsIFwidHJlZWdyaWRcIl0uaW5jbHVkZXMoaGllci5yb2xlKSk7XG59XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi9DU1NVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXNVdGlsIHtcbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnQgdGFncyB3aGljaCBjYW4gbm90IGJlIGhpZGRlbiwgd2hlbiBoaWRkZW4gaXNcbiAgICAvLyBhZGRlZCB0byB0aGVzZXMgZWxlbWVudHMgaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgYXQgYWxsLlxuICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAvLyAgICAgICAgICAgbWFrZSBhbiBjZXJ0aWFuIHBhcnRzIG9mIGFuIG1hcCBpbnRlcmFjdGl2ZS5cbiAgICAvLyAgcGFyYW0gLS0+IGVsZW1lbnQgY2FuIG9ubHkgYmUgcGFydCBvZiBvYmplY3QgZWxtZW50IGFuZCBpdCBjYW5ub3QgYmUgaGlkZGVuIGRpcmVjdGx5LCBpdFxuICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgIC8vICBhdWRpbyAtLT4gSWYgdGhpcyBlbGVtZW50IGlzIGhpZGRlbiBpdCB3aWxsIHN0aWxsIHBsYXkgdGhlIG11c2ljLCBzbyB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlclxuICAgIC8vICAgICAgICAgICAgdmlvbGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LlxuICAgIC8vIE5vdGU6IEFsbCBlbGVtZW50IHRhZ3MgdGhhdCBhcmUgYWRkZWQgaGVyZSBzaG91bGQgYmUgYWRkZWQgYXMgbG93ZXJjYXNlLCBhcyB3ZSBhcmUgdXNpbmcgaW5kZXhPZiB0byBkbyB0aGUgY2hlY2suXG4gICAgcHVibGljIHN0YXRpYyB1bmhpZGVhYmxlRWxlbWVudHMgPSBbJ2FyZWEnLCAncGFyYW0nLCAnYXVkaW8nXTtcblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGFncyB3aGljaCBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgaGF2ZSBydWxlcyB0cmlnZ2VyaW5nXG4gICAgLy8gb24gdGhlc2VzIGVsZW1lbnRzIHdlIG5lZWQgdG8gbWFrZSB0aGVuIHZpc2libGUgYnkgZGVmYXVsdCBzbyB0aGF0IHRoZSBydWxlcyBjYW4gdHJpZ2dlciByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIENoZWNrIEhpZGRlbiBDb250ZW50IG9wdGlvbiBpbiB0aGUgdG9vbHMuXG4gICAgLy8gIHNjcmlwdCAtLT4gc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0XG4gICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gICAgICAgICAgICBtYXJrIHRoaXMgZWxlbWVudCBhcyB2aXNpYmxlIGF0IGFsbCB0aW1lcy5cbiAgICAvLyAgc3R5bGUgLS0+IHN0eWxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIGhlYWQgLS0+IGhlYWQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlaGF2ZSBjb3JyZWN0XG4gICAgLy8gIHRpdGxlIC0tPiB0aXRsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgZGlzcGxheSB0aGUgdGl0bGUuIHJlbW92ZSB0aXRsZSBmcm9tIHRoZSBsaXN0IGJlY2F1c2UgYSB0aXRsZSBjYW4gYmUgYSBjaGlsZCBvZiBhIHN2ZyBlbGVtZW50IHRvb1xuICAgIC8vICBtZXRhIC0tPiBtZXRhIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgYmFzZSAtLT4gYmFzZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIG5vc2NyaXB0IC0tPiBub3NjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIHRlbXBsYXRlIC0tPiB0ZW1wbGF0ZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGEgbWVjaGFuaXNtIGZvciBob2xkaW5nIGNsaWVudC1zaWRlIGNvbnRlbnRcbiAgICAvLyAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IHRvIGJlIHJlbmRlcmVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZC4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RlbXBsYXRlXG4gICAgLy8gIGRhdGFsaXN0IC0tPiBkYXRhbGlzdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCxcbiAgICBwdWJsaWMgc3RhdGljIGhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzID0gWydzY3JpcHQnLCAnbGluaycsICdzdHlsZScsICdoZWFkJywgJ21ldGEnLCAnYmFzZScsICdub3NjcmlwdCcsICd0ZW1wbGF0ZScsICdkYXRhbGlzdCddXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiB2aXNpYmxlIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIENTUyAtLT4gZGlzbGF5OiBub25lXG4gICAgICogICAgICAgQ1NTIC0tPiB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGhpZGRlblxuICAgICAqICAgIDIuIENoZWNrIGlmIHRoZSBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgaGlkZGVuIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCB2aXNpYmxlKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgb3BhY2l0eTowIG9yIGZpbHRlcjpvcGFjaXR5KDAlKSwgb3Igc2ltaWxhciBTVkcgbWVjaGFuaXNtczogXG4gICAgICogICAgICBUaGV5IGFyZSBub3QgY29uc2lkZXJlZCBoaWRkZW4uIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgb3IgY29waWVkLCBcbiAgICAgKiAgICAgIGFuZCB1c2VyIGFnZW50cyBzdGlsbCBleHBvc2UgaXQgaW4gdGhlaXIgYWNjZXNzaWJpbGl0eSB0cmVlcy4gIFxuICAgICAqIFxuICAgICAqICAgIE5vdGU6IG5vZGVzIGhpZGRlbiBvZmYgc2NyZWVuIG9yIGJlaGluZCBhbm90aGVyIG9iamVjdDogdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuLiBcbiAgICAgKiAgICAgIFRoZXkgYXJlIGV4cG9zZWQgaW4gdGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgdGhleSBjYW4gZXZlbiBuYW1lIG9uLXNjcmVlbiBvYmplY3RzLlxuICAgICAqIFxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGZhbHNlIGlmIHRoZSBub2RlIGlzIE5PVCB2aXNpYmxlLCB0cnVlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFZpc1V0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGVJbjogTm9kZSkgOiBib29sZWFuIHtcblxuICAgICAgICAvLyBDaGVjayB0aGUgbm9kZVR5cGUgaWYgdGhpcyBub2RlLCBpZiB0aGlzIG5vZGUgaXMgYSB0ZXh0IG5vZGUgdGhlblxuICAgICAgICAvLyB3ZSBnZXQgdGhlIHBhcmVudG5vZGUgYW5kIHNldCB0aGF0IGFzIHRoZSBub2RlIGFzIGEgdGV4dCBub2RlcyxcbiAgICAgICAgLy8gdmlzaWJpbGl0eSBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGVJbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZUluID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUluKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5vZGVJbiBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vIGRhdGFsaXN0IC0tPiBJbiB0aGUgcmVuZGVyaW5nLCB0aGUgZGF0YWxpc3QgZWxlbWVudCByZXByZXNlbnRzIG5vdGhpbmcgYW5kIGl0LCBhbG9uZyB3aXRoIGl0cyBjaGlsZHJlbiwgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgICAgaWYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdW5kZWZpbmVkKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSkpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgaGlkZGVuIGVsZW1lbnQgcHJvcGVydHkgYW5kIGhpZGRlbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCBoaWRkZW5BdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eUN1c3RvbSA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAvLyBUbyBnZXQgdGhlIGhpZGRlbiBwcm9wZXJ0eSB3ZSBuZWVkIHRvIHBlcmZvcm0gYSBzcGVjaWFsIGNoZWNrIGFzIGluIHNvbWUgY2FzZXMgdGhlIGhpZGRlbiBwcm9wZXJ0eSB3aWxsIG5vdCBiZVxuICAgICAgICAgICAgLy8gYSBib29sZWFuLCBmb3IgdGhlc2VzIGNhc2VzIHdlIHNldCBpdCB0byBmYWxzZSBhcyB3ZSBhcmUgbm90IGFibGUgdG8gZGV0ZXJtaW5lIHRoZSB0cnVlIGhpZGRlbiBjb25kaXRpb24uXG4gICAgICAgICAgICAvLyBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGJlY2F1c2UgZm9ybSBlbGVtZW50cyBhcmUgYWJsZSB0byBwZXJmb3JtIGFuIG92ZXJyaWRlLCBzbyB3aGVuIHdlIGhhdmUgaWQ9XCJoaWRkZW5cIiBmb3IgYW4gZWxlbWVudFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgdW5kZXIgdGhlIGZvcm0gZWxlbWVudCB0aGVuLCBub2RlLmhpZGRlbiBnaXZlcyB0aGUgZWxlbWVudC9saXN0IG9mIGVsZW1lbnRzIHdoaWNoIGhhdmUgaWQ9XCJoaWRkZW5cIi4gUmVmZXIgdG9cbiAgICAgICAgICAgIC8vIG1vemlsbGEgYnVnOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjY3MzU2XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHkgPSB0eXBlb2YgKG5vZGUgYXMgYW55KS5oaWRkZW4gPT09IFwiYm9vbGVhblwiID8gKG5vZGUgYXMgYW55KS5oaWRkZW4gOiBmYWxzZTtcbiAgICAgICAgICAgIC8vIElmIGNvbXBTdHlsZSBvYmplY3QgaXMgZW1wdHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIHByb3BlcnR5LCBub2RlIGRvZXMndCBoYXZlIGhpZGRlbiBhdHRyaWJ1dGUgYW5kIGRvZXMndCBoYXZlIGN1c3RvbSBQVFxuICAgICAgICAgICAgLy8gaGlkZGVuIHByb3BlcnR5IHRoZW4gd2UgY2FuIGp1c3QgcmV0dXJuIHRydWUgKG5vZGUgdmlzaWJsZSkgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgIGlmICghY29tcFN0eWxlICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5ICYmIC8vIHRoaXMgY292ZXJzIGZhbHNlLCBudWxsLCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAoaGlkZGVuQXR0cmlidXRlID09PSBudWxsIHx8IGhpZGRlbkF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgICAgICFoaWRkZW5Qcm9wZXJ0eUN1c3RvbSAvLyBUaGlzIGNvdmVycyBmYWxzZSwgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjb21wU3R5bGUgaXMgZGVmaW5lZCB3ZSBjaGVjayB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgLy8gIENTUyBzdHlsZSBkaXNwbGF5IHNldCB0byBub25lXG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIHZpc2liaWxpdHkgc2V0IHRvIGhpZGRlblxuICAgICAgICAgICAgLy8gICAgTm90ZTogRm9yIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgaW5oZXJpdGVkLCBuZWVkIHRvIHNraXAgdGhlIGNoZWNrIG9uIHBhcmVudHMgYXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoZSBwYXJlbnQgY2FuIGhhdmUgaGlkZGVuIGJ1dCB0aGUgY2hpbGQgY2FuIGJlIHZpc2libGUuIFNvIHdlIG9ubHkgY2hlY2sgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gICAgICAgICAgb24gY2hpbGQgZWxlbWVudHMvZWxlbWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAvLyAgbm9kZSBoaWRkZW4gcHJvcGVydHkgc2V0IChub2RlLmhpZGRlbilcbiAgICAgICAgICAgIC8vICBub2RlIGF0dHJpYnV0ZSBoaWRkZW4gc2V0ICh0byBhbnkgdmFsdWUpXG4gICAgICAgICAgICAvLyAgbm9kZSBjdXN0b20gaGlkZGVuIHByb3BlcnR5IHNlciAobm9kZS5QVF9OT0RFX0hJRERFTilcbiAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHdlIHJldHVybiBmYWxzZSBhcyB0aGlzIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGlmICgoY29tcFN0eWxlICE9PSBudWxsICYmICgoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8XG4gICAgICAgICAgICAgICAgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJWaXNpYmlsaXR5X0NoZWNrX1BhcmVudFwiLCBudWxsKSAmJiBjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJykpKSB8fFxuICAgICAgICAgICAgICAgIChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpICE9PSAnYmxvY2snICAmJiAoaGlkZGVuUHJvcGVydHkgfHwgaGlkZGVuQXR0cmlidXRlICE9IG51bGwgfHwgaGlkZGVuUHJvcGVydHlDdXN0b20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYSBjdXN0b20gZXhwYW5kb3MgcHJvcGVydHkgb24gdGhlIHRoZSBub2RlIHRvIGlkZW50aWZ5IHRoYXQgaXQgaXMgaGlkZGVuLCBzbyB0aGF0IHdlIGNhbiB1c2VzXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoaXMgaW4gdGhlIHJ1bGVzIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBpcyBoaWRkZW4gb3Igbm90LCBpZiB3ZSBuZWVkIHRvLlxuICAgICAgICAgICAgICAgIC8vIFVzZSBleHBhbmRvcyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGFzaCBtYXAgd2hpY2ggc3RvcmVzIHRoZSBlbGVtZW50cywgYWRkaW5nL2NoZWNraW5nIGV4cGFuZG9zXG4gICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpcyBhIGxvdCBmYXN0ZXIgcGVyZm9ybWFuY2Ugd2hpc2UuIEZvciBIYXNoIG1hcCB3ZSBuZWVkIHRvIHN0b3JlIGJhc2VkIG9uIHhwYXRoLCBhbmQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8geHBhdGggaXQgaXMgbW9yZSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudC12aXNpYmlsaXR5OiBpZiB0aGUgY29udGVudC12aXNpYmlsaXR5IGlzIGhpZGRlbiwgdGhlbiwgcmV0dXJuIGZhbHNlIGFzIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoVmlzVXRpbC5pc0NvbnRlbnRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlIGZvciB0aGlzIG5vZGUsIGJlY3Vhc2Ugd2UgaGF2ZSB0byBjaGVjayBhbGwgcGFyZW50cyB0byBtYWtlIHN1cmUgdGhleSBkbyBub3QgaGF2ZVxuICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90IGZvciBhbGwgdGhlIHBhcmVudHMgc3RhcnRpbmcgd2l0aFxuICAgICAgICAvLyBjaGlsZCBub2RlLlxuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsICYmIHBhcmVudEVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBhIHBhcmVudCBlbGVtZW50IGdvaW5nIHRocm91Z2ggdGhlIGlzTm9kZVZpc2libGUgZnVuY3Rpb24gd2UgaGF2ZSB0byBtYXJrIGl0IGFzIHN1Y2hcbiAgICAgICAgICAgIC8vIHNvIHRoYXQgaW4gdGhlIGZ1bmN0aW9uIHdlIGNhbiBza2lwIGNoZWNraW5nIHZpc2liaWxpdHk6IGhpZGRlbiBmb3IgcGFyZW50IGVsZW1lbnRzIHNpbmNlIHZpc2liaWxpdHk6IGhpZGRlblxuICAgICAgICAgICAgLy8gaXMgaW5oZXJpdGVkLCB3aGljaCBhbGxvd3MgYSBjaGlsZCB0byBoYXZlIGEgZGlmZmVyZW50IHNldHRpbmcgdGhlbiB0aGUgY2hpbGQuIFRoaXMgcHJvcGVydHkgb25seSBuZWVkcyB0byBiZSBjaGVja2VkXG4gICAgICAgICAgICAvLyBvbmNlIGZvciB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHBhc3NlZCBkb3duIGFuZCB0aGF0IGlzIGFsbC4gSWdub3JlIGl0IGZvciBhbGwgdGhlIHBhcmVudHMgdGhhdCB3ZSBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocGFyZW50RWxlbWVudCBhcyBFbGVtZW50LCBcIlZpc2liaWxpdHlfQ2hlY2tfUGFyZW50XCIsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5LCBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBpbiBhbiB2YXJpYWJsZVxuICAgICAgICAgICAgbGV0IG5vZGVWaXNpYmxlID0gVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBmb3VuZCB0byBub3QgYmUgdmlzaWJsZSB0aGVuIGFkZCB0aGUgY3VzdG9tIFBUX05PREVfSElEREVOIHRvIHRydWUuXG4gICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiB1c2UgdGhpcyBpbiB0aGUgcnVsZXMuXG4gICAgICAgICAgICAvLyBpZiAoIW5vZGVWaXNpYmxlKSB7XG4gICAgICAgICAgICAvLyAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIG5vZGVWaXNpYmxlKTtcbiAgICAgICAgICAgIHJldHVybiBub2RlVmlzaWJsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0cnVlIChub2RlIGlzIHZpc2libGUpXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjbGlwcGluZyBvciBvcGFxOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuOlxuICAgICAqICAgICAgIENTUyAtLT4gY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXG4gICAgICogICAgICAgQ1NTIC0tPiBvcGFjaXR5OiAwXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIG9yIG9wYWNpdHk6MCBvciBmaWx0ZXI6b3BhY2l0eSgwJSksIG9yIHNpbWlsYXIgU1ZHIG1lY2hhbmlzbXM6IFxuICAgICAqICAgICAgVGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuIHRvIGFuIEFULiBUZXh0IGhpZGRlbiB3aXRoIHRoZXNlIG1ldGhvZHMgY2FuIHN0aWxsIGJlIHNlbGVjdGVkIG9yIGNvcGllZCwgXG4gICAgICogICAgICBhbmQgdXNlciBhZ2VudHMgc3RpbGwgZXhwb3NlIGl0IGluIHRoZWlyIGFjY2Vzc2liaWxpdHkgdHJlZXMuICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbihub2RlOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZWQgc3R5bGVzIG9ubHkgZ2l2ZSB0aGUgc3R5bGVzIHRoYXQgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgZGVmaW5lZF9zdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbSk7XG4gICAgICAgICAgICBpZiAoKGRlZmluZWRfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddICYmIGRlZmluZWRfc3R5bGVzWydjbGlwJ10ucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknKVxuICAgICAgICAgICAgICAgIHx8IChkZWZpbmVkX3N0eWxlc1snb3BhY2l0eSddICYmIHBhcnNlRmxvYXQoZGVmaW5lZF9zdHlsZXNbJ29wYWNpdHknXSkgPCAwLjEpKSAge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgY29uc3QgaGlkID0gVmlzVXRpbC5pc05vZGVWaXN1YWxseUhpZGRlbihwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIGhpZCk7XG4gICAgICAgICAgICByZXR1cm4gaGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIGhpZGRlbiBieSBDU1MgY29udGVudC12aXNpYmlsaXR5OmhpZGRlblxuICAgICAqIEF0IHRoaXMgdGltZSwgQ1NTIGNvbnRlbnQtdmlzaWJpbGl0eSBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkIGJ5IENocm9tZSAmIEVkZ2UsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3hcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gVEVNUE9SQVJJTFkgZm9sbG93cyB0aGUgQ2hyb21lIHRlc3QgcmVzdWx0czpcbiAgICAgKiAgIGlmIGNvbnRlbnQtdmlzaWJpbGl0eTpoaWRkZW5cbiAgICAgKiAgICAgIGlmIHRoZSBlbGVtZW50IGlzIGJsb2NrLWxldmVsIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgaGlkZGVuO1xuICAgICAqICAgICAgaWYgdGhlIGVsZW1lbnQgaXMgaW5saW5lIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgTk9UIGhpZGRlbjsgXG4gICAgICogXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29udGVudEhpZGRlbihub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgICBcblxuICAgICAgICBjb25zdCBzdHlsZSA9ICBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnRfdmlzaWJpbGl0eSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50LXZpc2liaWxpdHlcIik7XG4gICAgICAgIGlmIChjb250ZW50X3Zpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgICAgIH0gXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTsgXG4gICAgICAgIC8vIGlubGluZSBlbGVtZW50IG9ubHlcbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9ICBcbiAgICAgICAgXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfQ29udGVudEhpZGRlblwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgb2Zmc2NyZWVuIGJ5IENTUyBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0VsZW1lbnRPZmZzY3JlZW4obm9kZTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSAsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgXG5cbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlKTsgXG4gICAgICAgIGlmICghYm91bmRzKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCB0cnVlKTsgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwIHx8IChib3VuZHNbJ3RvcCddK2JvdW5kc1snaGVpZ2h0J10pIDw9IDAgfHwgKGJvdW5kc1snbGVmdCddK2JvdW5kc1snd2lkdGgnXSkgPD0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBcblxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgIFxuXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgbGV0IGFuY2VzdG9yID0gRE9NVXRpbC5nZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUobm9kZSwgXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hpZGRlbkZyb21BVFwiLCBmYWxzZSk7ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIG5hdGl2ZWx5IGhpZGRlbiBvciBhcmlhLWhpZGRlbiA9ICd0cnVlJ1xuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVQcmVzZW50YXRpb25hbChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG5vZGUpO1xuICAgICAgICBpZiAocm9sZSAmJiAocm9sZSA9PT0gJ25vbmUnIHx8IHJvbGUgPT09ICdwcmVzZW50YXRpb24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZXhwb3J0IHsgQ29udGV4dCB9IGZyb20gXCIuL3YyL2NvbW1vbi9Db250ZXh0XCJcbi8vIGltcG9ydCB7IFNpbXVsYXRvciB9IGZyb20gXCIuL3YyL3NpbXVsYXRvclwiXG5pbXBvcnQgeyBDaGVja2VyIH0gZnJvbSBcIi4vdjQvY2hlY2tlci9DaGVja2VyXCJcbmV4cG9ydCB7IENoZWNrZXIgfVxuZXhwb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuZXhwb3J0IHsgQ29uZmlnIH0gZnJvbSBcIi4vdjIvY29uZmlnL0NvbmZpZ1wiO1xuZXhwb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPSBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggfHwgZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiB0aGlzLmluZGV4T2Yoc3RyKSA9PT0gMDtcbn1cblN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgPSBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgIT09IC0xO1xufVxuQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzID0gQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgIT09IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tEZW1vKHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICBpZiAoIXRpbWVvdXQpIHRpbWVvdXQgPSAwO1xuICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIoKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBjaGVja2VyLmNoZWNrKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fRGVzaWduXCJdKVxuICAgICAgICAudGhlbihmdW5jdGlvbihyZXBvcnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcG9ydCk7XG4gICAgICAgICAgICBjb25zdCB2YWxzID0ge1xuICAgICAgICAgICAgICAgIFwiRkFJTFwiOiAwLFxuICAgICAgICAgICAgICAgIFwiUE9URU5USUFMXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJNQU5VQUxcIjogMixcbiAgICAgICAgICAgICAgICBcIlBBU1NcIjogM1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxyZXBvcnQucmVzdWx0cy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5yZXN1bHRzW2lkeF0udmFsdWVbMV0gPT09IFwiUEFTU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydC5yZXN1bHRzLnNwbGljZShpZHgtLSwxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zb3J0KChhLGIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS5jYXRlZ29yeSAhPSBiLmNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmNhdGVnb3J5LmxvY2FsZUNvbXBhcmUoYi5jYXRlZ29yeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhLnBhdGhbXCJhcmlhXCJdID09PSBiLnBhdGhbXCJhcmlhXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxzW2EudmFsdWVbMV1dLXZhbHNbYi52YWx1ZVsxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhLnBhdGhbXCJhcmlhXCJdLmxvY2FsZUNvbXBhcmUoYi5wYXRoW1wiYXJpYVwiXSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgbGV0IGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjYXRlZ29yeSA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXBvcnQucmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPT0gcmVzdWx0LmNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gcmVzdWx0LmNhdGVnb3J5O1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKHJlc3VsdC5jYXRlZ29yeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5wYXRoW1wiYXJpYVwiXSAhPSBsYXN0UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0UGF0aCA9IHJlc3VsdC5wYXRoW1wiYXJpYVwiXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKFwicGFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXAobGFzdFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC52YWx1ZSwgcmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9KTtcbiAgICB9LCB0aW1lb3V0KTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/rule-server/src/static/archives/2024.12.12/js/ace-node-debug.js b/rule-server/src/static/archives/2024.12.12/js/ace-node-debug.js new file mode 100644 index 000000000..549bc9f99 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/js/ace-node-debug.js @@ -0,0 +1,31003 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 8235: +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }), + +/***/ 4944: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(8235); +var CommonMapper_1 = __webpack_require__(1794); +var DOMUtil_1 = __webpack_require__(295); +var CommonUtil_1 = __webpack_require__(8137); +var AriaUtil_1 = __webpack_require__(490); +var fragment_1 = __webpack_require__(482); +var ARIAWalker_1 = __webpack_require__(8015); +var CacheUtil_1 = __webpack_require__(7788); +var DOMWalker_1 = __webpack_require__(7440); +var AccNameUtil_1 = __webpack_require__(1421); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem_1 = node; + for (var idx = 0; idx < elem_1.attributes.length; ++idx) { + var attrInfo = elem_1.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + var applyAttrRole = function (nodeName) { + if (!(nodeName in ARIAMapper.elemAttrValueCalculators)) + return; + for (var attr in ARIAMapper.elemAttrValueCalculators[nodeName]) { + if (!(attr in retVal)) { + var value = ARIAMapper.elemAttrValueCalculators[nodeName][attr]; + if (typeof value != "undefined" && value !== null) { + if (typeof value !== typeof "") { + value = value(elem_1); + } + retVal[attr] = value; + } + } + } + }; + applyAttrRole("global"); + applyAttrRole(node.nodeName.toLowerCase()); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + for (var attr in ARIAMapper.textAttrValueCalculators) { + var val = ARIAMapper.textAttrValueCalculators[attr](node); + if (typeof val != "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + for (var iId = 0; iId < ownIds.length; ++iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || "none", + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || "none"), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_1 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_1) { + parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_1 && parent_1.nodeType !== 1) { + parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === "none" || parentInfo.role === "/none") { + parent_1 = ARIAMapper.getAriaOwnedBy(parent_1) || DOMWalker_1.DOMWalker.parentElement(parent_1); + parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || "none", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = "none"; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== "none") { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = this.hierarchyResults[idx].role.substring(1); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== "none") { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_2 ? CacheUtil_1.CacheUtil.getCache(parent_2, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": AccNameUtil_1.AccNameUtil.computeAccessibleName //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + if (elem.getAttribute("type") === "checkbox" || elem.getAttribute("type") === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = parent.querySelectorAll("li"); + var otherlis = parent.querySelectorAll("ol li, ul li, menu li"); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = parent.querySelectorAll("li"); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }), + +/***/ 8015: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(482); +var ARIAMapper_1 = __webpack_require__(4944); +var VisUtil_1 = __webpack_require__(8656); +var DOMWalker_1 = __webpack_require__(7440); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }), + +/***/ 9193: +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }), + +/***/ 482: +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }), + +/***/ 2527: +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }), + +/***/ 1794: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(7440); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || "none"; + this.hierarchyRole.push(role); + if (role !== "none") { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== "none") { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }), + +/***/ 2306: +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }), + +/***/ 9324: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(7440); +var Context_1 = __webpack_require__(2306); +var Config_1 = __webpack_require__(3962); +var DOMMapper_1 = __webpack_require__(5697); +var DOMUtil_1 = __webpack_require__(295); +var CacheUtil_1 = __webpack_require__(7788); +var IRule_1 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + do { + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }), + +/***/ 3962: +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }), + +/***/ 5697: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(1794); +var CacheUtil_1 = __webpack_require__(7788); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var bunds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (bunds === undefined) { + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + } + return bunds; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var bunds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (bunds === undefined) { + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + } + return bunds; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }), + +/***/ 295: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(7440); +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + // return true if element1 and element2 (cells) are in the same table + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Copies objects, but retains Node attributes as references + * @param rhs + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }), + +/***/ 7440: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(8656); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }), + +/***/ 1970: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StyleMapper = void 0; +var CommonMapper_1 = __webpack_require__(1794); +var StyleMapper = /** @class */ (function (_super) { + __extends(StyleMapper, _super); + function StyleMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + StyleMapper.prototype.getRole = function (node) { + return "computed"; + }; + StyleMapper.prototype.getNamespace = function () { + return "css"; + }; + StyleMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + var style = elem.ownerDocument.defaultView.getComputedStyle(elem); + for (var idx = 0; idx < style.length; ++idx) { + var name_1 = style[idx].toLowerCase(); + retVal[name_1] = style[name_1]; + } + } + return retVal; + }; + return StyleMapper; +}(CommonMapper_1.CommonMapper)); +exports.StyleMapper = StyleMapper; + + +/***/ }), + +/***/ 3005: +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }), + +/***/ 4377: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(3005); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(3005); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(3005); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }), + +/***/ 7884: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(4377); +var Engine_1 = __webpack_require__(9324); +var ARIAMapper_1 = __webpack_require__(4944); +var StyleMapper_1 = __webpack_require__(1970); +var rulesets_1 = __webpack_require__(1070); +var checkRulesV4 = __webpack_require__(8081); +var IGuideline_1 = __webpack_require__(3005); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addMapper(new StyleMapper_1.StyleMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }), + +/***/ 8980: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }), + +/***/ 3961: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var IRule_2 = __webpack_require__(4377); +var AccNameUtil_1 = __webpack_require__(1421); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ 1445: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }), + +/***/ 876: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(490); +var VisUtil_1 = __webpack_require__(8656); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 2768: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ 2533: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var VisUtil_1 = __webpack_require__(8656); +var AccNameUtil_1 = __webpack_require__(1421); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:form, aria:heading, aria:rowheader, aria:table, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ 7178: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ 9745: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var fragment_1 = __webpack_require__(482); +var VisUtil_1 = __webpack_require__(8656); +var DOMUtil_1 = __webpack_require__(295); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }), + +/***/ 8019: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_application_label_unique.html", + "Fail_1": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "application", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_application_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_application_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 6505: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AccNameUtil_1 = __webpack_require__(1421); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_application_labelled.html", + "Fail_1": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 8910: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_article_label_unique.html", + "Fail_1": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "article", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_article_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_article_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1; + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 3492: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var ARIADefinitions_1 = __webpack_require__(8235); +var AriaUtil_1 = __webpack_require__(490); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }), + +/***/ 5316: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ 8412: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ 172: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var ARIADefinitions_1 = __webpack_require__(8235); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ 9844: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ 9695: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(8235); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ 1699: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var ARIADefinitions_1 = __webpack_require__(8235); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 4974: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_label_unique.html", + "Fail_1": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "banner", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_banner_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_banner_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 3054: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ 4649: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var ARIADefinitions_1 = __webpack_require__(8235); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + var roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + // Determine if this is referenced by a combobox. If so, focus is controlled by the combobox + // ignore if the id of the element is referenced by another element with "aria-controls" or "aria-expanded" and with certain roles. If so, focus is controlled by the referencing element + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + /**if (ruleContext.ownerDocument.querySelector(`*[aria-controls='${id}'][role='combobox']`)) { + return null; + } + */ + var elem = ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][aria-haspopup='true'], *[aria-controls='").concat(id, "'][aria-expanded='true']")); + var containers_1 = ['combobox', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (elem && CommonUtil_1.CommonUtil.isTabbable(elem) && roles && roles.length > 0 && roles.some(function (r) { return containers_1.includes(r); })) + return null; + } + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + for (var j = 0; j < roles.length; ++j) { + if (ARIADefinitions_1.ARIADefinitions.containers.includes(roles[j])) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ 4193: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }), + +/***/ 3188: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_unique.html", + "Fail_1": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "complementary", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_complementary_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_complementary_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 4176: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ 7964: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AccNameUtil_1 = __webpack_require__(1421); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ 2554: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +var DOMWalker_1 = __webpack_require__(7440); +var VisUtil_1 = __webpack_require__(8656); +var TableUtil_1 = __webpack_require__(5755); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 1229: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_label_unique.html", + "Fail_1": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "contentinfo", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_contentinfo_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_contentinfo_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 8523: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 3781: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 8509: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + var tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + explicitRoles.push(childRoles.join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ 3234: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_document_label_unique.html", + "Fail_1": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "document", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_document_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_document_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel === "" || !(myLabel in dupes) || dupes[myLabel] <= 1; + // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 5217: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }), + +/***/ 4050: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_form_label_unique.html", + "Fail_1": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + // form element should only be considered if it has an aria label or title + if (ruleContext.getAttribute("role") === "form" || + ruleContext.hasAttribute("aria-label") || + ruleContext.hasAttribute("aria-labelledby") || + ruleContext.hasAttribute("title")) { + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "form", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_form_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_form_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && + (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + } +}; + + +/***/ }), + +/***/ 4275: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }), + +/***/ 1465: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ 405: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var fragment_1 = __webpack_require__(482); +var ARIADefinitions_1 = __webpack_require__(8235); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 9136: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }), + +/***/ 5117: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var ARIADefinitions_1 = __webpack_require__(8235); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }), + +/***/ 9062: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var ARIAMapper_1 = __webpack_require__(4944); +var DOMUtil_1 = __webpack_require__(295); +var fragment_1 = __webpack_require__(482); +var CacheUtil_1 = __webpack_require__(7788); +var AccNameUtil_1 = __webpack_require__(1421); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "Pass_0", + "Fail_0": "Fail_0" + } + }, + help: { + "en-US": { + "Pass_0": "aria_landmark_name_unique.html", + "Fail_0": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "Fail_0": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(function (elem) { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null; // Skipping checking landmarks that happen to be inside dialog elements + } + } + }); + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + var a = navigationNodes[i]; + var dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("Fail_0"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("Fail_0"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("Pass_0"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "Pass_0") { + return (0, IRule_1.RulePass)("Pass_0", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "Fail_0") { + return (0, IRule_1.RuleFail)("Fail_0", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }), + +/***/ 5746: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }), + +/***/ 8685: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 2678: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_navigation_label_unique.html", + "Fail_1": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "navigation", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_navigation_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_navigation_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + //return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 971: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var ARIADefinitions_1 = __webpack_require__(8235); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 3709: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_label_unique.html", + "Fail_1": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Per https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + // form element should only be considered if it has an aria label or title + if (ruleContext.getAttribute("role") === "region" || + ruleContext.hasAttribute("aria-label") || + (ruleContext.hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, ruleContext.getAttribute("aria-labelledby"))) || + ruleContext.hasAttribute("title")) { + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "region", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_region_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_region_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && + (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + } +}; + + +/***/ }), + +/***/ 6486: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ 4151: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }), + +/***/ 8545: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var TableUtil_1 = __webpack_require__(5755); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + if (["td", "th", "tr"].includes(elemName)) { + var parentRole = TableUtil_1.TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ 8538: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_search_label_unique.html", + "Fail_1": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "search", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_search_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_search_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + // return new ValidationResult(passed, ruleContext, '', '', [ myLabel ]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 1908: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }), + +/***/ 6360: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 5386: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var ARIAMapper_1 = __webpack_require__(4944); +var fragment_1 = __webpack_require__(482); +var ARIADefinitions_1 = __webpack_require__(8235); +var DOMUtil_1 = __webpack_require__(295); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }), + +/***/ 8752: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 4392: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 932: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }), + +/***/ 6255: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 5743: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ 2671: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }), + +/***/ 3974: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var fragment_1 = __webpack_require__(482); +var DOMWalker_1 = __webpack_require__(7440); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + //let nw = new NodeWalker(popupElement); + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }), + +/***/ 9881: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DOMWalker_1 = __webpack_require__(7440); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + //let nw = new NodeWalker(popupElement); + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }), + +/***/ 1226: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var CacheUtil_1 = __webpack_require__(7788); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }), + +/***/ 7369: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DOMWalker_1 = __webpack_require__(7440); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + //let nw = new NodeWalker(popupElement); + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }), + +/***/ 2633: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CacheUtil_1 = __webpack_require__(7788); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }), + +/***/ 2429: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var fragment_1 = __webpack_require__(482); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }), + +/***/ 7874: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(4377); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }), + +/***/ 3334: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }), + +/***/ 4298: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 4435: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ 1685: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }), + +/***/ 6313: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var ARIADefinitions_1 = __webpack_require__(8235); +var AccNameUtil_1 = __webpack_require__(1421); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 9109: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CacheUtil_1 = __webpack_require__(7788); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 9918: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ 8105: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var fragment_1 = __webpack_require__(482); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "Pass_0": "element_id_unique.html", + "Fail_1": "element_id_unique.html", + "Fail_2": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element has the id \"{1}\" that is empty", + "Fail_2": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RuleFail)("Fail_1", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 8687: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var lang_1 = __webpack_require__(2527); +var VisUtil_1 = __webpack_require__(8656); +var DOMWalker_1 = __webpack_require__(7440); +var AccNameUtil_1 = __webpack_require__(1421); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }), + +/***/ 2150: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }), + +/***/ 4557: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CSSUtil_1 = __webpack_require__(1775); +var VisUtil_1 = __webpack_require__(8656); +var CacheUtil_1 = __webpack_require__(7788); +var fragment_1 = __webpack_require__(482); +var CommonUtil_1 = __webpack_require__(8137); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // When degree is 1 turn (360 degree), it is not considered an orientation lock + // allow 1 degree floating range for the right angle + if (Math.abs(degree - 360) % 360 > 1) + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + else + ret.push((0, IRule_1.RulePass)("pass")); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }), + +/***/ 4721: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +var CSSUtil_1 = __webpack_require__(1775); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styles = getComputedStyle(ruleContext); + // not scrollable, inapplicable + if ((styles.overflowX === 'visible' || styles.overflowX === 'hidden') + && (styles.overflowY === 'visible' || styles.overflowY === 'hidden')) + return null; + // ignore if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(ruleContext.offsetWidth, ruleContext.offsetHeight) < 30 || Math.min(ruleContext.offsetWidth, ruleContext.offsetHeight) < 15) + return null; + // ignore if both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, ruleContext) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, ruleContext); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, ruleContext) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, ruleContext); + if (ruleContext.scrollWidth - ruleContext.clientWidth < 1 + padding_x + && ruleContext.scrollHeight - ruleContext.clientHeight < 1 + padding_y) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [nodeName]); + } +}; + + +/***/ }), + +/***/ 2814: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var ARIADefinitions_1 = __webpack_require__(8235); +var CSSUtil_1 = __webpack_require__(1775); +var DOMWalker_1 = __webpack_require__(7440); +var VisUtil_1 = __webpack_require__(8656); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore elements with CSS overflow: scroll or auto + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); + if (styles['overflow-x'] === 'scroll' || styles['overflow-y'] === 'scroll' + || styles['overflow-x'] === 'auto' || styles['overflow-y'] === 'auto') + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }), + +/***/ 9188: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +var DOMMapper_1 = __webpack_require__(5697); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + ; + //in case the bounds not available + if (!bounds) + return null; + //ignore if offscreen + if (bounds['height'] === 0 || bounds['width'] === 0) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var cStyle = win.getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || zindex === 'auto') + zindex = "0"; + var elems = doc.querySelectorAll('body *:not(script)'); + if (!elems || elems.length == 0) + return; + var violations = []; + var before = true; + elems.forEach(function (elem) { + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + */ + if (ruleContext.contains(elem)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + } + else if (VisUtil_1.VisUtil.isNodeVisible(elem) && !elem.contains(ruleContext)) { + var bnds = mapper.getUnadjustedBounds(elem); + var zStyle = win.getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + if (bnds.height !== 0 && bnds.width !== 0 + && bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.height >= bounds.left + bounds.width + && (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index))) { + violations.push(elem); + } + } + }); + if (violations.length > 0) { + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ 7601: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var CSSUtil_1 = __webpack_require__(1775); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DOMMapper_1 = __webpack_require__(5697); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // defined styles only give the styles that changed + var defined_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); + var onfocus_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus"); + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + var focus_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus"); + var focus_visible_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus-visible"); + var focus_within_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus-within"); + var checked_styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":checked"); + if (focus_styles || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }), + +/***/ 4497: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 152: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_noembed_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.embed_noembed_exists = { + id: "embed_noembed_exists", + context: "dom:embed", + refactor: { + "WCAG20_Embed_HasNoEmbed": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_noembed_exists.html", + "Potential_1": "embed_noembed_exists.html", + "group": "embed_noembed_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element is immediately followed by a non-embedded element", + "group": "<embed> elements should be immediately followed by a non-embedded element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getElementsByTagName("noembed").length > 0; + if (!passed) { + var walkNode = ruleContext.nextSibling; + while (!passed && walkNode !== null) { + if (walkNode.nodeName.toLowerCase() == "noembed") + passed = true; + else if (walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + break; + else if (walkNode.nodeType == 1) + break; + walkNode = walkNode.nextSibling; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 935: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 9719: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var fragment_1 = __webpack_require__(482); +var VisUtil_1 = __webpack_require__(8656); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ 5625: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var fragment_1 = __webpack_require__(482); +var CacheUtil_1 = __webpack_require__(7788); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var AccNameUtil_1 = __webpack_require__(1421); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }), + +/***/ 9115: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ 6072: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +var AccNameUtil_1 = __webpack_require__(1421); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 6923: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 9015: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 3611: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var fragment_1 = __webpack_require__(482); +var CacheUtil_1 = __webpack_require__(7788); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 4846: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var DOMWalker_1 = __webpack_require__(7440); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + //let nw = new NodeWalker(ruleContext, true); + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 3277: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(4377); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 4525: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 7114: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AccNameUtil_1 = __webpack_require__(1421); +var VisUtil_1 = __webpack_require__(8656); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }), + +/***/ 3751: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 7084: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 3981: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var ancestor_1 = __webpack_require__(9193); +var lang_1 = __webpack_require__(2527); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }), + +/***/ 9788: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var fragment_1 = __webpack_require__(482); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 4419: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +var DOMMapper_1 = __webpack_require__(5697); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }), + +/***/ 2575: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }), + +/***/ 8124: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 3440: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ 2193: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var VisUtil_1 = __webpack_require__(8656); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 309: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 6281: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ 7748: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DOMWalker_1 = __webpack_require__(7440); +var CommonUtil_1 = __webpack_require__(8137); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + //let walk = new NodeWalker(aNode); + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + //walk = new NodeWalker(aNode, true); + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }), + +/***/ 8856: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var VisUtil_1 = __webpack_require__(8656); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, ignore + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }), + +/***/ 7393: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 9410: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 8081: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(8980), exports); +__exportStar(__webpack_require__(3961), exports); +__exportStar(__webpack_require__(1445), exports); +__exportStar(__webpack_require__(876), exports); +__exportStar(__webpack_require__(2768), exports); +__exportStar(__webpack_require__(2533), exports); +__exportStar(__webpack_require__(7178), exports); +__exportStar(__webpack_require__(9745), exports); +__exportStar(__webpack_require__(8019), exports); +__exportStar(__webpack_require__(6505), exports); +__exportStar(__webpack_require__(8910), exports); +__exportStar(__webpack_require__(3492), exports); +__exportStar(__webpack_require__(5316), exports); +__exportStar(__webpack_require__(8412), exports); +__exportStar(__webpack_require__(172), exports); +__exportStar(__webpack_require__(9844), exports); +__exportStar(__webpack_require__(9695), exports); +__exportStar(__webpack_require__(1699), exports); +__exportStar(__webpack_require__(4974), exports); +__exportStar(__webpack_require__(3054), exports); +__exportStar(__webpack_require__(4649), exports); +__exportStar(__webpack_require__(4193), exports); +__exportStar(__webpack_require__(3188), exports); +__exportStar(__webpack_require__(4176), exports); +__exportStar(__webpack_require__(7964), exports); +__exportStar(__webpack_require__(2554), exports); +__exportStar(__webpack_require__(1229), exports); +__exportStar(__webpack_require__(8523), exports); +__exportStar(__webpack_require__(3781), exports); +__exportStar(__webpack_require__(8509), exports); +__exportStar(__webpack_require__(3234), exports); +__exportStar(__webpack_require__(5217), exports); +__exportStar(__webpack_require__(4050), exports); +__exportStar(__webpack_require__(4275), exports); +__exportStar(__webpack_require__(1465), exports); +__exportStar(__webpack_require__(405), exports); +__exportStar(__webpack_require__(9136), exports); +__exportStar(__webpack_require__(5117), exports); +__exportStar(__webpack_require__(9062), exports); +__exportStar(__webpack_require__(5746), exports); +__exportStar(__webpack_require__(8685), exports); +__exportStar(__webpack_require__(2678), exports); +__exportStar(__webpack_require__(971), exports); +__exportStar(__webpack_require__(3709), exports); +__exportStar(__webpack_require__(6486), exports); +__exportStar(__webpack_require__(4151), exports); +__exportStar(__webpack_require__(8545), exports); +__exportStar(__webpack_require__(8538), exports); +__exportStar(__webpack_require__(1908), exports); +__exportStar(__webpack_require__(6360), exports); +__exportStar(__webpack_require__(5386), exports); +__exportStar(__webpack_require__(8752), exports); +__exportStar(__webpack_require__(4392), exports); +__exportStar(__webpack_require__(932), exports); +__exportStar(__webpack_require__(6255), exports); +__exportStar(__webpack_require__(5743), exports); +__exportStar(__webpack_require__(2671), exports); +__exportStar(__webpack_require__(3974), exports); +__exportStar(__webpack_require__(9881), exports); +__exportStar(__webpack_require__(1226), exports); +__exportStar(__webpack_require__(7369), exports); +__exportStar(__webpack_require__(2633), exports); +__exportStar(__webpack_require__(2429), exports); +__exportStar(__webpack_require__(7874), exports); +__exportStar(__webpack_require__(3334), exports); +__exportStar(__webpack_require__(4298), exports); +__exportStar(__webpack_require__(4435), exports); +__exportStar(__webpack_require__(1685), exports); +__exportStar(__webpack_require__(6313), exports); +__exportStar(__webpack_require__(9109), exports); +__exportStar(__webpack_require__(9918), exports); +__exportStar(__webpack_require__(8105), exports); +__exportStar(__webpack_require__(8687), exports); +__exportStar(__webpack_require__(2150), exports); +__exportStar(__webpack_require__(4557), exports); +__exportStar(__webpack_require__(4721), exports); +__exportStar(__webpack_require__(2814), exports); +__exportStar(__webpack_require__(9188), exports); +__exportStar(__webpack_require__(7601), exports); +__exportStar(__webpack_require__(4497), exports); +__exportStar(__webpack_require__(152), exports); +__exportStar(__webpack_require__(935), exports); +__exportStar(__webpack_require__(9719), exports); +__exportStar(__webpack_require__(5625), exports); +__exportStar(__webpack_require__(9115), exports); +__exportStar(__webpack_require__(6072), exports); +__exportStar(__webpack_require__(6923), exports); +__exportStar(__webpack_require__(9015), exports); +__exportStar(__webpack_require__(3611), exports); +__exportStar(__webpack_require__(4846), exports); +__exportStar(__webpack_require__(3277), exports); +__exportStar(__webpack_require__(4525), exports); +__exportStar(__webpack_require__(7114), exports); +__exportStar(__webpack_require__(3751), exports); +__exportStar(__webpack_require__(7084), exports); +__exportStar(__webpack_require__(3981), exports); +__exportStar(__webpack_require__(9788), exports); +__exportStar(__webpack_require__(4419), exports); +__exportStar(__webpack_require__(2575), exports); +__exportStar(__webpack_require__(8124), exports); +__exportStar(__webpack_require__(3440), exports); +__exportStar(__webpack_require__(2193), exports); +__exportStar(__webpack_require__(309), exports); +__exportStar(__webpack_require__(6281), exports); +__exportStar(__webpack_require__(7748), exports); +__exportStar(__webpack_require__(8856), exports); +__exportStar(__webpack_require__(7393), exports); +__exportStar(__webpack_require__(9410), exports); +__exportStar(__webpack_require__(8589), exports); +__exportStar(__webpack_require__(3366), exports); +__exportStar(__webpack_require__(8929), exports); +__exportStar(__webpack_require__(5403), exports); +__exportStar(__webpack_require__(5937), exports); +__exportStar(__webpack_require__(4452), exports); +__exportStar(__webpack_require__(7209), exports); +__exportStar(__webpack_require__(8262), exports); +__exportStar(__webpack_require__(7017), exports); +__exportStar(__webpack_require__(9980), exports); +__exportStar(__webpack_require__(7733), exports); +__exportStar(__webpack_require__(1256), exports); +__exportStar(__webpack_require__(9532), exports); +__exportStar(__webpack_require__(6698), exports); +__exportStar(__webpack_require__(9632), exports); +__exportStar(__webpack_require__(3692), exports); +__exportStar(__webpack_require__(5430), exports); +__exportStar(__webpack_require__(1018), exports); +__exportStar(__webpack_require__(3433), exports); +__exportStar(__webpack_require__(8012), exports); +__exportStar(__webpack_require__(3881), exports); +__exportStar(__webpack_require__(3106), exports); +__exportStar(__webpack_require__(1276), exports); +__exportStar(__webpack_require__(5424), exports); +__exportStar(__webpack_require__(4248), exports); +__exportStar(__webpack_require__(9526), exports); +__exportStar(__webpack_require__(9379), exports); +__exportStar(__webpack_require__(5495), exports); +__exportStar(__webpack_require__(7753), exports); +__exportStar(__webpack_require__(1252), exports); +__exportStar(__webpack_require__(3576), exports); +__exportStar(__webpack_require__(3617), exports); +__exportStar(__webpack_require__(6110), exports); +__exportStar(__webpack_require__(5681), exports); +__exportStar(__webpack_require__(1922), exports); +__exportStar(__webpack_require__(7906), exports); +__exportStar(__webpack_require__(5451), exports); +__exportStar(__webpack_require__(6349), exports); +__exportStar(__webpack_require__(5393), exports); +__exportStar(__webpack_require__(9887), exports); +__exportStar(__webpack_require__(5102), exports); +__exportStar(__webpack_require__(9977), exports); +__exportStar(__webpack_require__(8454), exports); +__exportStar(__webpack_require__(25), exports); +__exportStar(__webpack_require__(2884), exports); +__exportStar(__webpack_require__(5390), exports); +__exportStar(__webpack_require__(7196), exports); +__exportStar(__webpack_require__(9965), exports); +__exportStar(__webpack_require__(4468), exports); +__exportStar(__webpack_require__(4451), exports); +__exportStar(__webpack_require__(6087), exports); +__exportStar(__webpack_require__(5864), exports); +__exportStar(__webpack_require__(4066), exports); +__exportStar(__webpack_require__(2841), exports); +__exportStar(__webpack_require__(272), exports); +__exportStar(__webpack_require__(1348), exports); +__exportStar(__webpack_require__(6215), exports); +__exportStar(__webpack_require__(5275), exports); +__exportStar(__webpack_require__(7900), exports); +__exportStar(__webpack_require__(5027), exports); +__exportStar(__webpack_require__(3496), exports); +__exportStar(__webpack_require__(1131), exports); +__exportStar(__webpack_require__(8681), exports); +__exportStar(__webpack_require__(4577), exports); +__exportStar(__webpack_require__(8051), exports); + + +/***/ }), + +/***/ 8589: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }), + +/***/ 3366: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var DOMWalker_1 = __webpack_require__(7440); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +var TableUtil_1 = __webpack_require__(5755); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }), + +/***/ 8929: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 5403: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }), + +/***/ 5937: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DOMWalker_1 = __webpack_require__(7440); +var CommonUtil_1 = __webpack_require__(8137); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + //let walkNode = new NodeWalker(labelElem); + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ 4452: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ 7209: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var VisUtil_1 = __webpack_require__(8656); +var AccNameUtil_1 = __webpack_require__(1421); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }), + +/***/ 8262: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var fragment_1 = __webpack_require__(482); +var VisUtil_1 = __webpack_require__(8656); +var DOMUtil_1 = __webpack_require__(295); +var AccNameUtil_1 = __webpack_require__(1421); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + /** + if (CommonUtil.hasImplicitLabel(ruleContext)) + return RulePass("pass"); + + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + return RulePass("pass"); + + // special cases + let type = ruleContext.getAttribute("type"); + if (nodeName === 'input' && type) { + type = type.toLowerCase(); + //submit type of input has a visible label 'Submit' by default + if (type === 'submit' || type === 'reset') + return RulePass("pass"); + //image type of input requires a non-empty alt text + if (type === 'image' && CommonUtil.attributeNonEmpty(ruleContext, "alt")) + return RulePass("pass"); + } + */ + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + // and (3) an alternative tooltip exists that can be made visible through mouseover + /**if (!CommonUtil.isInnerTextEmpty(ruleContext)) + return RulePass("pass"); + + // check if an alternative tooltip exists that can be made visible through mouseover + if (CommonUtil.attributeNonEmpty(ruleContext, "title")) + return RulePass("pass"); + */ + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + /**if (nodeName === "optgroup" && CommonUtil.attributeNonEmpty(ruleContext, "label")) + return RulePass("pass"); + + if (nodeName == "option" && (CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0)) + return RulePass("pass"); + */ + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }), + +/***/ 7017: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }), + +/***/ 9980: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(4377); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }), + +/***/ 7733: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var fragment_1 = __webpack_require__(482); +var DOMUtil_1 = __webpack_require__(295); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }), + +/***/ 1256: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var fragment_1 = __webpack_require__(482); +var VisUtil_1 = __webpack_require__(8656); +var CSSUtil_1 = __webpack_require__(1775); +var DOMWalker_1 = __webpack_require__(7440); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 9532: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var fragment_1 = __webpack_require__(482); +var VisUtil_1 = __webpack_require__(8656); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }), + +/***/ 6698: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var DOMWalker_1 = __webpack_require__(7440); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 9632: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var DOMWalker_1 = __webpack_require__(7440); +var VisUtil_1 = __webpack_require__(8656); +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + // "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + // "pass": "list_markup_review.html", + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + // "pass": "Proper HTML elements are used to create a list", + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", 'label']) !== null) + return null; + // ignore all widgets and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "columnheader", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something changes, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + var failure = /^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(txtVal); + passed = !failure; + if (!passed) { + // Ensure that there's some sort of block level element before this + // Avoid failures due to things like <i>Some sentence</i>. New sentence. + //let nw = new NodeWalker(walkNode); + var nw = new DOMWalker_1.DOMWalker(walkNode); + while (!passed && nw.prevNode()) { + var nodeName_1 = nw.node.nodeName.toLowerCase(); + if (["blockquote", "center", "dir", "div", "form", "h1", + "h2", "h3", "h4", "h5", "h6", "hr", "br", "menu", "p", + "pre"].includes(nodeName_1)) { + break; + } + if (nodeName_1 == "#text") { + var txt = nw.node.nodeValue; + passed = txt.length > 0 && ![" ", "\t", "\n"].includes(txt.charAt(txt.length - 1)); + } + } + } + } + walkNode = walkNode.nextSibling; + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("potential_list"); + } +}; + + +/***/ }), + +/***/ 3692: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 5430: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }), + +/***/ 1018: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 3433: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 8012: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ 3881: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 3106: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ 1276: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ 5424: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ 4248: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var fragment_1 = __webpack_require__(482); +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + act: [{ + "bc659a": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var content = ruleContext.getAttribute("content").toLowerCase(); + // Invalid content field + if (!content.match(/^\d+$/) && !content.match(/^\d+;/)) { + return null; + } + // Only check the first one since it takes priority + if (CommonUtil_1.CommonUtil.triggerOnce(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "meta_redirect_optional", false)) { + return null; + } + var timeMatch = content.match(/^(\d+); +[^ ]/); + if (!timeMatch || parseInt(timeMatch[1]) === 0) { + return (0, IRule_1.RulePass)("pass"); + } + else { + var time = parseInt(timeMatch[1]); + if (time < 72001) { + return (0, IRule_1.RuleFail)("fail"); + } + else { + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } + } + } +}; + + +/***/ }), + +/***/ 9526: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "Pass_0": "meta_refresh_delay.html", + "Potential_1": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "Pass_0": "Rule Passed", + "Potential_1": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: ["bisz58", "bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // Invalid content field + if (!content.match(/^\d+$/) && !content.match(/^\d+;/)) { + return null; + } + var fail = !content.match(/^\d+; +[^ ]/); + return !fail ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 9379: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "Pass_0": "pass", + "Potential_1": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }), + +/***/ 5495: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 7753: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +var AccNameUtil_1 = __webpack_require__(1421); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }), + +/***/ 1252: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var ancestor_1 = __webpack_require__(9193); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }), + +/***/ 3576: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }), + +/***/ 3617: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 6110: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 5681: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 1922: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 7906: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 5451: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 6349: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var ancestor_1 = __webpack_require__(9193); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 5393: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 9887: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CSSUtil_1 = __webpack_require__(1775); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 5102: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DOMWalker_1 = __webpack_require__(7440); +var CacheUtil_1 = __webpack_require__(7788); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + //let nw = new NodeWalker(ruleContext); + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 9977: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CSSUtil_1 = __webpack_require__(1775); +var ColorUtil_1 = __webpack_require__(8680); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + var normalStyles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); // consider noth user-defined and browser default + var focusStyles = []; + focusStyles.push(CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus")); + focusStyles.push(CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus-visible")); + focusStyles.push(CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ":focus-within")); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }), + +/***/ 8454: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CacheUtil_1 = __webpack_require__(7788); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }), + +/***/ 25: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }), + +/***/ 2884: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 5390: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AccNameUtil_1 = __webpack_require__(1421); +var VisUtil_1 = __webpack_require__(8656); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }), + +/***/ 7196: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }), + +/***/ 9965: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 4468: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 4451: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var TableUtil_1 = __webpack_require__(5755); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 6087: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var DOMUtil_1 = __webpack_require__(295); +var VisUtil_1 = __webpack_require__(8656); +var ARIAMapper_1 = __webpack_require__(4944); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }), + +/***/ 5864: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +var TableUtil_1 = __webpack_require__(5755); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 4066: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var VisUtil_1 = __webpack_require__(8656); +var TableUtil_1 = __webpack_require__(5755); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }), + +/***/ 2841: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }), + +/***/ 272: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var TableUtil_1 = __webpack_require__(5755); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }), + +/***/ 1348: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var fragment_1 = __webpack_require__(482); +var DOMUtil_1 = __webpack_require__(295); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }), + +/***/ 6215: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DOMMapper_1 = __webpack_require__(5697); +var CSSUtil_1 = __webpack_require__(1775); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + if (!elems || elems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = elems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + if (ruleContext.contains(elem)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // ignore ascendants of the element, not a target, or itself or its ascendant already checked + if (elem.contains(ruleContext) || !CommonUtil_1.CommonUtil.isTarget(elem) + || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + var zStyle; + for (var i = 0; i < elems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }), + +/***/ 5275: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var DOMWalker_1 = __webpack_require__(7440); +var CSSUtil_1 = __webpack_require__(1775); +var VisUtil_1 = __webpack_require__(8656); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + //let nw = new NodeWalker(ruleContext); + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }), + +/***/ 7900: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var ColorUtil_1 = __webpack_require__(8680); +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CSSUtil_1 = __webpack_require__(1775); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + ; + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + ; + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }), + +/***/ 5027: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }), + +/***/ 3496: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }), + +/***/ 1131: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +var VisUtil_1 = __webpack_require__(8656); +var CSSUtil_1 = __webpack_require__(1775); +var DOMMapper_1 = __webpack_require__(5697); +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + if (bounds['top'] < 0 || bounds['left'] < 0) + return null; + //skip no-html element + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) + return null; + // Ensure that this element has children with actual text. + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length == 0) + return null; + //font size always resolved to 'px' + var font_size_style = getComputedStyle(ruleContext).getPropertyValue('font-size'); + var font_size = parseFloat(font_size_style); + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext); + if (Object.keys(styles).length === 0) + return null; + //note that CSS unit is required for non-zero values, otherwise it's ignored + var ret = []; + // matched string: original style, the style value and unit + var regex = /(-?[\d.]+)([a-z%]*)/; + var word_style = styles['word-spacing']; + if (word_style) { + if (word_style.startsWith('inherit') || word_style.startsWith('unset')) { + //get closet ancestor's word-spacing + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext.parentElement, { "word-spacing": ["*"] }, ['inherit', 'unset']); + if (ancestor !== null) { + word_style = CSSUtil_1.CSSUtil.getDefinedStyles(ancestor)['word-spacing']; + } + else if (word_style.startsWith('unset')) { + word_style = "initial"; + } + } + if (ruleContext.style.getPropertyPriority("word-spacing") === 'important') { + word_style = word_style.substring(0, word_style.length - "!important".length - 1); + // computed space is 0 for 'normal' or 'initial'. + if (word_style === 'initial' || word_style === 'normal') + ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style")); + else { + var wordSpacing = parseFloat(word_style); + if (!isNaN(wordSpacing)) { + var parsed = word_style.trim().match(regex); + if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(parsed[2], parsed[1], ruleContext); + if (pixels !== null && pixels / font_size < 0.16) + ret.push((0, IRule_1.RuleFail)("fail_word_spacing_style")); + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + var letter_style = styles['letter-spacing']; + if (letter_style) { + if (letter_style.startsWith('inherit') || letter_style.startsWith('unset')) { + //get closet ancestor's word-spacing + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext.parentElement, { "letter-spacing": ["*"] }, ['inherit', 'unset']); + if (ancestor !== null) { + letter_style = CSSUtil_1.CSSUtil.getDefinedStyles(ancestor)['letter-spacing']; + } + else if (letter_style.startsWith('unset')) { + letter_style = "initial"; + } + } + if (ruleContext.style.getPropertyPriority("letter-spacing") === 'important') { + letter_style = letter_style.substring(0, letter_style.length - "!important".length - 1); + // computed space is 0 for 'normal' or 'initial'. + if (letter_style === 'initial' || letter_style === 'normal') + ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style")); + else { + var letterSpacing = parseFloat(letter_style); + if (!isNaN(letterSpacing)) { + var parsed = letter_style.trim().match(regex); + if (parsed[2] !== '' && parsed[1] !== 0) { //no zero value without unit which is considered as error, so implicable + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(parsed[2], parsed[1], ruleContext); + if (pixels !== null && pixels / font_size < 0.12) + ret.push((0, IRule_1.RuleFail)("fail_letter_spacing_style")); + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + var line_style = styles['line-height']; + var overflow = { "overflow": ['auto', 'scroll'], "overflow-x": ['auto', 'scroll'], "overflow-y": ['auto', 'scroll'] }; + if (line_style && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflow) === null) { + if (line_style.startsWith('inherit') || line_style.startsWith('unset')) { + //get closet ancestor's word-spacing + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext.parentElement, { "line-height": ["*"] }, ['inherit', 'unset']); + if (ancestor !== null) { + line_style = CSSUtil_1.CSSUtil.getDefinedStyles(ancestor)['line-height']; + } + else if (line_style.startsWith('unset')) { + line_style = "initial"; + } + } + if (ruleContext.style.getPropertyPriority("line-height") === 'important') { + line_style = line_style.substring(0, line_style.length - "!important".length - 1); + // computed space is 0 for 'normal' or 'initial'. + if (line_style === 'initial' || line_style === 'normal') + ret.push((0, IRule_1.RuleFail)("fail_line_height_style")); + else { + var lineHeight = parseFloat(line_style); + if (!isNaN(lineHeight)) { + var parsed = line_style.trim().match(regex); + if (parsed[2] === '') { //line-height are allowed unitless when the valie is multiple (or fraction) of the font size + if (parsed[1] < 1.5) + ret.push((0, IRule_1.RuleFail)("fail_line_height_style")); + else + ret.push((0, IRule_1.RulePass)("pass")); + } + else { + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(parsed[2], parsed[1], ruleContext); + if (pixels !== null && pixels / font_size < 1.5) + ret.push((0, IRule_1.RuleFail)("fail_line_height_style")); + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + } + else + ret.push((0, IRule_1.RulePass)("pass")); + } + if (ret.length > 0) + return ret; + return null; //implicable or ignore + } +}; + + +/***/ }), + +/***/ 8681: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var CommonUtil_1 = __webpack_require__(8137); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }), + +/***/ 4577: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var ARIAMapper_1 = __webpack_require__(4944); +var DOMWalker_1 = __webpack_require__(7440); +var VisUtil_1 = __webpack_require__(8656); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + //let nw = new NodeWalker(ruleContext); + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }), + +/***/ 8051: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(4377); +var IRule_2 = __webpack_require__(4377); +var DOMWalker_1 = __webpack_require__(7440); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var ARIAMapper_1 = __webpack_require__(4944); +var CacheUtil_1 = __webpack_require__(7788); +var VisUtil_1 = __webpack_require__(8656); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + //let nw = new NodeWalker(ruleContext); + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + if (nw.node.nodeName.toLowerCase() === 'input' && nw.node.getAttribute("type") === 'radio') { + var curName = nw.node.getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + } + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }), + +/***/ 1070: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __webpack_require__(4976); +var IGuideline_1 = __webpack_require__(3005); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }), + +/***/ 1421: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(8235); +var CommonUtil_1 = __webpack_require__(8137); +var AriaUtil_1 = __webpack_require__(490); +var VisUtil_1 = __webpack_require__(8656); +var CacheUtil_1 = __webpack_require__(7788); +var DOMWalker_1 = __webpack_require__(7440); +var DOMUtil_1 = __webpack_require__(295); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as the first or last child + var caption = elem.firstElementChild; + if (!caption) { + caption = elem.lastElementChild; + if (caption && caption.nodeName.toLowerCase() === 'figcaption') { + // figcaption can be mixed text + var text = caption.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_1 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_1 += " " + pair.name.trim(); + } + }); + if (text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_2 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_2 += title.trim(); + } + }); + if (text_2 && text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = element.textContent; + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_3 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_3 += desc.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlostElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlostElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) + text += " " + walkChild.nodeValue.trim(); + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }), + +/***/ 490: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(7788); +var ARIADefinitions_1 = __webpack_require__(8235); +var ARIAMapper_1 = __webpack_require__(4944); +var DOMWalker_1 = __webpack_require__(7440); +var VisUtil_1 = __webpack_require__(8656); +var CommonUtil_1 = __webpack_require__(8137); +var fragment_1 = __webpack_require__(482); +var DOMUtil_1 = __webpack_require__(295); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && roleNames.includes(role)) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i]) ? CommonUtil_1.CommonUtil.getInnerText(labelNode) : ""; + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele) ? CommonUtil_1.CommonUtil.getInnerText(labelNode) : ""; + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).toLowerCase().trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele) ? CommonUtil_1.CommonUtil.getInnerText(labelNode) : ""; + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i]) ? CommonUtil_1.CommonUtil.getInnerText(labelNode) : ""; + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_1 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (scope === 'column') + tagProperty = specialTagProperties["des-table-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-table-grid-treegrid-row-scope"]; + } + else { + tagProperty = specialTagProperties["des-other"]; + } + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail = true; + } + } + } + } + if (applicable && !fail) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }), + +/***/ 1775: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(7788); +var CommonUtil_1 = __webpack_require__(8137); +var AriaUtil_1 = __webpack_require__(490); +var DOMMapper_1 = __webpack_require__(5697); +var DOMWalker_1 = __webpack_require__(7440); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + try { + if (selector.trim() === "") + return false; + if (typeof element.matches === "function") { + return element.matches(selector); + } + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Native functions not there, fallback + var matches = (element.document || element.ownerDocument).querySelectorAll(selector); + var i = 0; + while (i < matches.length && matches[i] !== element) { + ++i; + } + return i < matches.length; + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, pseudoClass) { + // console.log("Function: getDefinedStyles"); + if (!elem) + return null; + var definedStyles = {}; + var definedStylePseudo = {}; + function fillStyle(maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + //override !important only if it is also !important + map[key] = style[key] + " !important"; + //don't override !important if it is not !important + else + continue; + } + //create/overide anyway + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + } + var storedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!pseudoClass && storedStyles) { + definedStyles = storedStyles["definedStyles"]; + definedStylePseudo = storedStyles["definedStylePseudo"]; + } + else { + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < elem.ownerDocument.styleSheets.length; ++ssIndex) { + var sheet = elem.ownerDocument.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + // console.log("Got sheet"); + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + // console.log("Got rule: ", sheet.cssRules[rIndex]); + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass + ? pseudoMatch[1] + : fullRuleSelector; + var selPseudo = hasPseudoClass + ? pseudoMatch[2] + : ""; + var samePseudoClass = selPseudo === pseudoClass; + if (pseudoClass && pseudoClass === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Get styles of non-pseudo selectors + if (!hasPseudoClass && + CSSUtil.selectorMatchesElem(elem, selMain)) { + fillStyle([definedStyles, definedStylePseudo], rule.style); + } + if (samePseudoClass && + CSSUtil.selectorMatchesElem(elem, selMain)) { + fillStyle([definedStylePseudo], rule.style); + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // + // Handled the stylesheets, now handle the element defined styles + fillStyle([definedStyles, definedStylePseudo], elem.style); + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", { + definedStyles: definedStyles, + definedStylePseudo: definedStylePseudo, + }); + } + /** + * 'initial' sets the style back to default + for (const key in definedStyles) { + if (definedStyles[key] === "initial") { + delete definedStyles[key]; + } + } + for (const key in definedStylePseudo) { + if (definedStylePseudo[key] === "initial") { + delete definedStylePseudo[key]; + } + } + */ + if (!pseudoClass) { + // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStyles, null, 2)); + return definedStyles; + } + else { + for (var key in definedStylePseudo) { + if (definedStylePseudo[key] === definedStyles[key]) { + delete definedStylePseudo[key]; + } + } + // console.log("[DEBUG: CSSUtil::getDefinedStyles]", elem.nodeName, pseudoClass, JSON.stringify(definedStylePseudo, null, 2)); + return definedStylePseudo; + } + }; + /** + * Returns the media query defined for the document + * + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var elem_transforms = orientationTransforms[mediaList.item(i).toLocaleLowerCase()]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var i_1 = 0; i_1 < styleRules.length; ++i_1) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[i_1].STYLE_RULE) { + var styleRule = styleRules[i_1]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + if (key.toLocaleLowerCase() === "transform") { + if (key === "all" && styles[key]) { + delete transforms[key]; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (key.toLocaleLowerCase() === "rotate") { + transforms[key] = styles[key]; + } + elem_transforms[selector] = + transforms; + } + } + } + if (mediaList.item(i_1)) + orientationTransforms[mediaList.item(i_1).toLocaleLowerCase()] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue == 0) + return 0; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * return the ancestor with the given style properties. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {[string]} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @parm {bool} excludedValues - style values that should be ignored. + * @return {node} walkNode - A parent node of the element, which has the style properties + * @memberOf AriaUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + var walkNode = elem; + while (walkNode !== null) { + var node = CacheUtil_1.CacheUtil.getCache(walkNode, "AriaUtil_AncestorWithStyles", null); + if (node) + return node; + var styles = CSSUtil.getDefinedStyles(walkNode); + for (var style in styleProps) { + var value = styles[style]; + if (value) { + value = value.split(" ")[0]; //get rid of !important + if (!excludedValues.includes(value)) { + if (styleProps[style].includes('*')) { + CacheUtil_1.CacheUtil.setCache(walkNode, "AriaUtil_AncestorWithStyles", walkNode); + return walkNode; + } + else if (styleProps[style].includes(value)) { + CacheUtil_1.CacheUtil.setCache(walkNode, "AriaUtil_AncestorWithStyles", walkNode); + return walkNode; + } + } + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + CacheUtil_1.CacheUtil.setCache(elem, "AriaUtil_AncestorWithStyles", undefined); + return null; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }), + +/***/ 7788: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMWalker_1 = __webpack_require__(7440); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.clearCaches = function (cacheRoot) { + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }), + +/***/ 8680: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(7440); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) {} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }), + +/***/ 8137: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(8235); +var CacheUtil_1 = __webpack_require__(7788); +var AriaUtil_1 = __webpack_require__(490); +var AccNameUtil_1 = __webpack_require__(1421); +var VisUtil_1 = __webpack_require__(8656); +var DOMUtil_1 = __webpack_require__(295); +var DOMWalker_1 = __webpack_require__(7440); +var fragment_1 = __webpack_require__(482); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + if (element.hasAttribute("contenteditable")) + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + //let nw = new NodeWalker(root); + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + //let nw = new NodeWalker(root); + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + //let nw = new NodeWalker(parentNode); + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if ((nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase())) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue !== null) + text += nw.node.nextSibling.nodeValue; + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue !== null) { + text += nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = function (element) { return __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName != "TH"; }); }; + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor) { + if (labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = node.ownerDocument.querySelectorAll("*[aria-labelledby]"); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, node.getAttribute("aria-labelledby"))) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", false); + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + //let nw = new NodeWalker(element); + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + return element.getAttribute("type") !== "hidden" && !element.hasAttribute("disabled"); + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": true, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }), + +/***/ 5755: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(8656); +var AriaUtil_1 = __webpack_require__(490); +var CommonUtil_1 = __webpack_require__(8137); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }), + +/***/ 8656: +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(7788); +var DOMUtil_1 = __webpack_require__(295); +var DOMWalker_1 = __webpack_require__(7440); +var DOMMapper_1 = __webpack_require__(5697); +var AriaUtil_1 = __webpack_require__(490); +var CSSUtil_1 = __webpack_require__(1775); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + if (CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined) !== undefined) { + return CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", false)); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + return true; + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + return true; + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + return false; + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + return false; + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + return nodeVisible; + } + // Return true (node is visible) + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + return true; + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var defined_styles = CSSUtil_1.CSSUtil.getDefinedStyles(elem); + if ((defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (defined_styles['opacity'] && parseFloat(defined_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }), + +/***/ 4976: +/***/ ((module) => { + +module.exports = JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +var exports = __webpack_exports__; + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(2306); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(7884); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(4944); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(3962); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(7440); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +String.prototype.startsWith = String.prototype.startsWith || function (str) { + return this.indexOf(str) === 0; +}; +String.prototype.includes = String.prototype.includes || function (str) { + return this.indexOf(str) !== -1; +}; +Array.prototype.includes = Array.prototype.includes || function (str) { + return this.indexOf(str) !== -1; +}; +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +module.exports = __webpack_exports__; +/******/ })() +; \ No newline at end of file diff --git a/rule-server/src/static/archives/2024.12.12/js/ace-node.js b/rule-server/src/static/archives/2024.12.12/js/ace-node.js new file mode 100644 index 000000000..1a9efb3f1 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/js/ace-node.js @@ -0,0 +1,2 @@ +/*! For license information please see ace-node.js.LICENSE.txt */ +(()=>{"use strict";var e={8235:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-grid-treegrid-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-grid-treegrid-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var l in i.designPatterns){var n=i.designPatterns[l].container;if(null!==n)for(var r=0,o=n;r<o.length;r++){var s=o[r];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},4944:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var n=i(8235),r=i(1794),o=i(295),s=i(8137),u=i(490),d=i(482),c=i(8015),m=i(7788),p=i(7440),h=i(1421),_=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in n.ARIADefinitions.designPatterns&&n.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){for(var a=e,l=0;l<a.attributes.length;++l){var n=a.attributes[l],r=n.name.toLowerCase();r.startsWith("aria-")&&(i[r.substring(5)]=n.nodeValue)}var o=function(e){if(e in t.elemAttrValueCalculators)for(var l in t.elemAttrValueCalculators[e])if(!(l in i)){var n=t.elemAttrValueCalculators[e][l];null!=n&&("string"!=typeof n&&(n=n(a)),i[l]=n)}};o("global"),o(e.nodeName.toLowerCase())}else if(3===e.nodeType)for(var s in t.textAttrValueCalculators){var u=t.textAttrValueCalculators[s](e);null!=u&&(i[s]=u)}return i},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var l=i[a],n=l.getAttribute("aria-owns").split(/ +/g),r=0;r<n.length;++r){var s=t.getElementById(n[r]);s&&!o.DOMUtil.sameNode(l,s)&&m.CacheUtil.setCache(s,"aria-owned",l)}m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],l=0,n=s;l<n.length;l++){var r=n[l];a.push(r)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||"none",rolePath:i.rolePath+"/"+(this.getRole(e)||"none"),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};"none"===i.role||"/none"===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||"none",rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role="none","none"!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)r=h[c],a.push(r);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var l=new c.ARIAWalker(a,!1,a);do{1===l.node.nodeType&&this.getNodeHierarchy(l.node)}while(l.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role.substring(1));return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),"none"!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var l=a[i];t.push(l)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var n=p.DOMWalker.parentElement(e);this.hierarchyResults=n?m.CacheUtil.getCache(n,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var l=a[i];if("presentation"===l||"none"===l){if(!s.CommonUtil.isFocusable(t))return null}else if(l in n.ARIADefinitions.designPatterns)return l}var r=u.AriaUtil.getImplicitRole(t),o=r&&0!==r.length?r[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:h.AccNameUtil.computeAccessibleName},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){return"checkbox"===e.getAttribute("type")||"radio"===e.getAttribute("type")?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=t.querySelectorAll("li"),a=t.querySelectorAll("ol li, ul li, menu li");return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=t.querySelectorAll("li"),a=0,l=0;l<i.length;++l){var n=i[l];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(n,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(r.CommonMapper);t.ARIAMapper=_},8015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(482),l=i(4944),n=i(8656),r=i(7440),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(r.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&n.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&n.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,r.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=r.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&l.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&n.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&n.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,r.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=r.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(r.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&l.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},9193:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},482:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter((function(e){return e.role===t}));return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter((function(e){return e.role===t}));return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},2527:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},1794:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(7440),l=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var l=0,n=t=t.reverse();l<n.length;l++){for(var r=n[l],o=[],s=r.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(r)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||"none";if(this.hierarchyRole.push(t),"none"!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){"none"!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var l=a[i];t.push(l)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=l},2306:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,l){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=l,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var l=i.attrs,n=e[i.namespace][t],r=!0,o=0,s=l;o<s.length;o++){var u=s[o];r=r&&u.matches(n)}return i.inclusive||(r=!r),r},e}();t.PartInfo=a;var l=function(){function e(e){this.contextInfo=[];for(var t=[],l=0,n=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);l<n.length;l++){for(var r=n[l].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=r[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}r[2]=r[2].toLowerCase();var c=r[2].split(":"),m="!"!==r[1],p=c.shift(),h=c.join(":"),_=new a(m,p,h,o,r[r.length-1]);t.push(_)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],l=0;l<i.length;++l){var n=new e(i[l]);a.push(n)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var l=a[i];t.push(l)}return t},e}();t.Context=l},9324:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(7440),l=i(2306),n=i(3962),r=i(5697),o=i(295),s=i(7788),u=i(4377),d=i(8656),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,n.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.prototype.run=function(t,i,a,l){var n,r=(new Date).getTime();try{n=this.rule.run(i,a,l)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();n||(n=[]),n instanceof Array||(n=[n]);for(var u=[],d=0,c=n;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var _ in i)h[_]=i[_].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-r,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node)})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.inclRules={},this.exclRules={},this.addMapper(new r.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1),s.CacheUtil.clearCaches(e);var i=new a.DOMWalker(e,!1,e,!0),l={results:[],numExecuted:0,ruleTime:0,totalTime:0},n=(new Date).getTime();for(var r in this.mappers)this.mappers[r].reset(e);do{var c={};for(var r in this.mappers)i.bEndTag?c[r]=this.mappers[r].closeScope(i.node):c[r]=this.mappers[r].openScope(i.node);if(11!==i.node.nodeType&&(d.VisUtil.isNodeVisible(i.node)||"meta"===i.node.nodeName.toLowerCase()||"style"===i.node.nodeName.toLowerCase()||"datalist"===i.node.nodeName.toLowerCase()||"param"===i.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(i.node,["body"]))){var m={};for(var p in c){var h=c[p],_=h[h.length-1];m[p]=_}for(var b={},g=0,f=this.getMatchingRules(c);g<f.length;g++){for(var v=f[g],A=!0,y=0,w=v.rule.dependencies||[];y<w.length;y++)b[w[y]]||(A=!1);if(A){var k=[];try{k=v.run(this,m,t,c)}catch(e){}0===k.length&&(b[v.rule.id]=!0);for(var C=0,x=k;C<x.length;C++){var P=x[C];l.results.push(P),l.ruleTime+=P.ruleTime,l.numExecuted++,P.value[1]===u.eRuleConfidence.PASS&&(b[P.ruleId]=!0)}}}}}while(i.nextNode());return s.CacheUtil.clearCaches(e),l.totalTime=(new Date).getTime()-n,Promise.resolve(l)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=l.Context.parse(e.context),a=0,n=e.id;if(n in this.ruleMap)console.log("WARNING: Rule",n,"already added to engine. Ignoring...");else{this.ruleMap[n]=e;for(var r=0,o=i;r<o.length;r++){var s=o[r],u=n;a>=1&&(u=n+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort((function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0}));for(var e in this.exclRules)this.exclRules[e].sort((function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0}))},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var l=this.nlsMap[e][t||0];return l?l.replace(/\{(\d+)\}/g,(function(e,t,a){return i[t]})):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(n.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,l=i[a].namespace,n=t[l][t[l].length-1],r=n.node;if(!i[a].matches(t,t[l].length-1))return!1;if(1===i.length)return!0;if(n=t[l=i[0].namespace][t[l].length-1],--a,i.slice(0,i.length-1).some((function(e){return e.namespace!==l})))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[l].length-(n.node.isSameNode(r)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var l=0,n=a;l<n.length;l++){var r=n[l];r.rule.enabled&&e.match(r,t)&&i.push(r)}}for(var l in t){var n=l+":"+(t[l].length>0?t[l][t[l].length-1].role:"none");for(var r in n in this.inclRules&&a(this.inclRules[n]),this.exclRules)r!==n&&a(this.exclRules[r]);n!==l+":none"&&(n.startsWith(l+":/")?l+":/*"in this.inclRules&&a(this.inclRules[l+":/*"]):l+":*"in this.inclRules&&a(this.inclRules[l+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var l=a[i];t.push(l)}var n=[],r={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in r)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in r||(d=!1);d&&(o=!0,n.push(u),r[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return n},e}();t.Engine=m},3962:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},5697:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var n=i(1794),r=i(7788),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var l=i.attributes[a];t[l.name.toLowerCase()]=l.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0===t){var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+l)*i),top:Math.ceil((a.top+n)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return r.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null}return t},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0===t){var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,n={left:Math.ceil(i.left+a),top:Math.ceil(i.top+l),height:Math.ceil(i.height),width:Math.ceil(i.width)};return r.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",n),n}return null}return t},t}(n.CommonMapper);t.DOMMapper=o},295:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(7440),l=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],l=e.getAncestor(t,a),n=e.getAncestor(i,a);if(null!==l&&null!=n&&e.sameNode(l,n))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var l=a[i];t.push(this.objectCopyWithNodeRefs(l))}}else for(var n in t={},e)t[n]=this.objectCopyWithNodeRefs(e[n]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var l=a.DOMWalker.parentNode(e);null!==l;){if(1===l.nodeType&&l.getAttribute(t)===i)return l;l=a.DOMWalker.parentNode(l)}return null},e}();t.DOMUtil=l},7440:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(8656),l=function(){function e(e,t,i,a,l){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!l,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],l=a.assignedNodes(),n=0;n<l.length;++n)l[n].slotOwner=a,l[n].slotIndex=n},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},l=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var n=this.node.slotOwner,r=this.node.slotIndex+1;r<n.assignedNodes().length?(this.node=n.assignedNodes()[r],this.bEndTag=!1):(this.node=n,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(l,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var l=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=l}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild?(l=this.node,this.node=i.shadowRoot,this.node.ownerElement=l,e.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=l},1970:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.StyleMapper=void 0;var n=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.getRole=function(e){return"computed"},t.prototype.getNamespace=function(){return"css"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=i.ownerDocument.defaultView.getComputedStyle(i),l=0;l<a.length;++l){var n=a[l].toLowerCase();t[n]=a[n]}return t},t}(i(1794).CommonMapper);t.StyleMapper=n},3005:(e,t)=>{var i,a,l;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(l=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",l.LEVEL_TWO="2",l.LEVEL_THREE="3",l.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},4377:(e,t,i)=>{var a,l;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(l=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var n=i(3005);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return n.eToolkitLevel}});var r=i(3005);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return r.eGuidelineCategory}});var o=i(3005);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7884:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var a=i(4377),l=i(9324),n=i(4944),r=i(1970),o=i(1070),s=i(8081),u=i(3005),d=[],c={},m={};!function(){var e=JSON.parse(JSON.stringify(l.Engine.getLanguages()));for(var t in e.push("en-US"),s){var i=s[t];d.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(c[i.id]=i.messages[n],c[i.id][0]=c[i.id].group),n in i.help){for(var r in m[i.id]={},i.help[n])m[i.id][r]="/".concat(n,"/").concat(i.help[n][r]);c[i.id][0]=c[i.id].group}}for(var u=0,p=i.rulesets;u<p.length;u++)for(var h=p[u],_=0,b=o.a11yRulesets;_<b.length;_++){var g=b[_];if(("string"==typeof h.id?[h.id]:h.id).includes(g.id))for(var f=0,v=g.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof h.num?[h.num]:h.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:h.reasonCodes,level:h.level,toolkitLevel:h.toolkitLevel}))}}}}();var p=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new l.Engine;e.addMapper(new n.ARIAMapper),e.addMapper(new r.StyleMapper),e.addRules(d),e.addNlsMap(c),e.addHelpMap(m);for(var t=0,i=o.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var l=a[i];l.rules=l.rules||[];for(var n=0,r=l.rules;n<r.length;n++){var o=r[n];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],l=!1,n=0,r=a.checkpoints;n<r.length;n++)for(var o=0,s=r[n].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(l=!0,delete u.enabled)}l&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],l=!1,n=0,r=a.checkpoints;n<r.length;n++)for(var o=0,s=r[n].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(l=!0,u.enabled=!1)}l&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter((function(t){return t.id!==e})),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map((function(e){return e.id}))},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,l=t;a<l.length;a++){var n=l[a];n in this.rulesetRules&&(i=i.concat(this.rulesetRules[n]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var r=this;return this.engine.run(e).then((function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var l=a[i];l.ruleId in c&&(e.nls[l.ruleId]=e.nls[l.ruleId]||{0:c[l.ruleId][0]},l.reasonId in c[l.ruleId]&&(e.nls[l.ruleId][l.reasonId]=c[l.ruleId][l.reasonId]));var n=l.reasonId?l.reasonId:"None";l.value[0]=r.getReasonLevel(t,l.ruleId,n),l.category=r.getCategory(t,l.ruleId),delete l.path.css}return e}))},e.prototype.getLevel=function(e,t){if(!e)return a.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],l=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,r=e;n<r.length;n++){var o=r[n];o in i&&(i[o]===a.eRulePolicy.VIOLATION?l=a.eRulePolicy.VIOLATION:i[o]===a.eRulePolicy.RECOMMENDATION&&null===l?l=a.eRulePolicy.RECOMMENDATION:null===l&&(l=a.eRulePolicy.INFORMATION))}}if(null===l)throw new Error("Rule triggered for which we have no rule level information: "+t);return l},e.prototype.getReasonLevel=function(e,t,i){if(!e)return a.eRulePolicy.INFORMATION;var l=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var r=function(e){if(e in l){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(l[e]).forEach((function(i){var r=null;"None"===i?r=l[e].None:t.test(i)&&(r=l[e][i]),null!==r&&(r===a.eRulePolicy.VIOLATION?n=a.eRulePolicy.VIOLATION:r===a.eRulePolicy.RECOMMENDATION&&null===n?n=a.eRulePolicy.RECOMMENDATION:null===n&&(n=a.eRulePolicy.INFORMATION))})),null===n&&(n=a.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)r(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return u.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,l=e;a<l.length;a++){var n=l[a];if(n in i)return i[n]}return u.eGuidelineCategory.OTHER},e}();t.Checker=p},8980:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(8137),l=i(8656),n=i(4377),r=i(4377);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:r.eRulePolicy.RECOMMENDATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(r)&&!a.CommonUtil.isTabbable(r))return null;var o={paramWinText:{value:["new window","new tab"],type:"array"}},s=r.getAttribute("target"),u="_parent"==s||"_self"==s||"_top"==s||null!=a.CommonUtil.getFrameByName(r,s);if(!u){var d=a.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(d+=" "+r.getAttribute("title"));for(var c=0;!u&&c<o.paramWinText.value.length;++c)-1!=d.indexOf(o.paramWinText.value[c])&&(u=!0)}return u?(0,n.RulePass)("pass"):(0,n.RulePotential)("potential_warn")}}},3961:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(4377),l=i(8137),n=i(8656),r=i(4377),o=i(1421);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(i)||l.CommonUtil.isNodeDisabled(i))return null;var r=o.AccNameUtil.computeAccessibleName(i);return r&&r.name&&r.name.trim().length>0||l.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},1445:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(8137),l=i(8656),n=i(4377),r=i(4377);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(r))return null;if(a.CommonUtil.attributeNonEmpty(r,"alt")){var o=r.getAttribute("alt").trim();return r.hasAttribute("code")&&o==r.getAttribute("code").trim()?(0,n.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(r)?(0,n.RulePass)("Pass_0"):(0,n.RuleFail)("Fail_3")}return(0,n.RuleFail)("Fail_1")}}},876:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(490),l=i(8656),n=i(4377),r=i(4377);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var r=!0,o=e.dom.node.childNodes,s=0;r&&s<o.length;s++)1===o[s].nodeType?l.VisUtil.isNodeVisible(o[s])&&(r=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(r=0===o[s].nodeValue.trim().length);return r?(0,n.RulePass)("Pass_0"):(0,n.RulePotential)("Potential_1")}}},2768:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(8137),l=i(8656),n=i(4377),r=i(4377);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(r)?null:a.CommonUtil.attributeNonEmpty(r,"alt")?(0,n.RulePass)("Pass_0"):(0,n.RuleFail)("Fail_1")}}},2533:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8656),o=i(1421);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:form, aria:heading, aria:rowheader, aria:table, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var s=l.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){if("table"===s&&l.firstElementChild&&"caption"===l.firstElementChild.nodeName.toLowerCase()&&l.firstElementChild.textContent&&l.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var u=n.AriaUtil.getRolesUndefinedByAria(l);if(u&&u.length>0)return null;var d=n.AriaUtil.getDeprecatedAriaRoles(l);if(d&&d.length>0)return null;var c=n.AriaUtil.getDeprecatedAriaAttributes(l);if(c&&c.length>0)return null;var m=n.AriaUtil.getResolvedRole(l),p=o.AccNameUtil.computeAccessibleName(l);return p&&p.name&&0!==p.name.trim().length?(0,a.RulePass)("pass"):"img"===m||"image"===m?(0,a.RuleFail)("fail_no_accessible_name_image",[l.nodeName.toLowerCase(),m]):(0,a.RuleFail)("fail_no_accessible_name",[l.nodeName.toLowerCase(),m])}}}},7178:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!1,o=l.nodeName.toLowerCase();if(l.hasAttribute("class")&&"mbl"==l.getAttribute("class").substring(0,3))return null;if(n.CommonUtil.isNodeDisabled(l))return null;if(0!==l.getAttribute("aria-activedescendant").trim().length){(r=n.CommonUtil.isTabbable(l))||(r=n.CommonUtil.getTabbableChildren(l)>0);var s=new Array;s.push(o);var u=new Array;return u.push(l.getAttribute("aria-activedescendant").split(" ").join(", ")),r?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},9745:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(482),s=i(8656),u=i(295);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.AriaUtil.hasRoleInSemantics(l,"combobox"))return null;var d=n.AriaUtil.getAriaAttribute(l,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(l,d.trim());if(!c||u.DOMUtil.sameNode(d,l))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(l.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(l.hasAttribute("aria-owns"))for(var p=r.CommonUtil.normalizeSpacing(l.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(l,p[h]))&&!u.DOMUtil.sameNode(v,l)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(n.AriaUtil.hasRoleInSemantics(l,"textbox")&&l.hasAttribute("aria-controls")){m=3;var _=r.CommonUtil.normalizeSpacing(l.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<_.length;h++){var b=o.FragmentUtil.getById(l,_[h]);if(b&&!u.DOMUtil.sameNode(b,l)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var g=r.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<g.length;f++){var v;if((v=o.FragmentUtil.getById(l,g[f]))&&!u.DOMUtil.sameNode(v,l)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},8019:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_application_label_unique.html",Fail_1:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"application",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_application_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_application_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},6505:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(4377),l=i(4377),n=i(1421),r=i(8656);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_application_labelled.html",Fail_1:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.AccNameUtil.computeAccessibleName(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},8910:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_article_label_unique.html",Fail_1:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"article",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_article_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_article_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""===d||!(d in u)||u[d]<=1?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3492:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(4377),l=i(4377),n=i(8235),r=i(490);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var l=e.dom.node,o=l.attributes;if(o){for(var s=n.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;r.AriaUtil.isDefinedAriaAttribute(l,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,l.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},5316:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=n.AriaUtil.getInvalidAriaAttributes(l);if(o&&o.length>0)return null;var s=[],u=n.AriaUtil.getUserDefinedAriaAttributes(l);if(!u||0===u.length)return null;for(var d=n.AriaUtil.getConflictAriaAndHtmlAttributes(l),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&r.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},8412:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=[],o=n.AriaUtil.getDeprecatedAriaRoles(l);if(o&&o.length>0)for(var s=0;s<o.length;s++)r.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=n.AriaUtil.getDeprecatedAriaAttributes(l);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?r.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):r.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return r.length>0?r:null}}},172:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235),s=i(8656);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=0,p=n.AriaUtil.getResolvedRole(l);if(p){if(d[p]&&null!=n.AriaUtil.getRoleRequiredProperties(p,l))for(var h=n.AriaUtil.getRoleRequiredProperties(p,l),_=0,b=h.length;_<b;_++)c(l,y=h[_])?(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute(h[_])).length&&u.push(h[_])):"aria-labelledby"==h[_]?"radiogroup"==p&&c(l,"aria-label")&&(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[_]&&"progressbar"==p&&c(l,"aria-valuetext")&&(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var g=n.AriaUtil.getElementAriaProperty(l),f=[];f.push(p);for(var v=n.AriaUtil.getAllowedAriaAttributes(l,f,g),A=(_=0,v.length);_<A;_++){var y;"aria-checked"!=(y=v[_])&&"aria-selected"!=y&&"aria-expanded"!=y&&"aria-orientation"!=y&&"aria-level"!=y||c(l,y)&&(m++,0!=r.CommonUtil.normalizeSpacing(l.getAttribute(y)).length||u.includes(y)||u.push(y))}}var w=new Array,k=0==u.length;return w.push(u.join(", ")),0==m?null:k?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",w)}}}}},9844:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.AriaUtil.getInvalidAriaAttributes(l);if(r&&r.length>0)return null;var o=n.AriaUtil.getConflictAriaAndHtmlAttributes(l);if(o&&o.length>0)return null;var s=l.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=l.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],_=function(e){var t=n.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach((function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))}))};for(c=0;c<u.length;c++)_(c);return h.length>0?h:null}}},9695:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(8235),l=i(490),n=i(8137),r=i(4377),o=i(4377);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=n.CommonUtil.hasAttribute,m=l.AriaUtil.getElementAriaProperty(o),p=l.AriaUtil.getResolvedRole(o);if(p){var h=l.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var _=l.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,g=0,f=h.length;g<f;g++)_.includes(h[g])&&(c(o,h[g])||("aria-labelledby"==h[g]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[g]),b=!0):"aria-valuenow"==h[g]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[g]),b=!0):"aria-controls"==h[g]&&"combobox"==p||(s.push(h[g]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,r.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,r.RuleFail)("fail_missing",v)}}}},1699:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var l=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=l.attributes,p=0;if(m)for(var h=0,_=m.length;h<_;h++){var b=m[h].name;if(n.AriaUtil.isDefinedAriaAttribute(l,b)){var g=c[b],f=r.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,g&&g.values){if(-1==g.values.indexOf(f))if(-1!=g.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===g.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(g.values.toString());else for(var A={},y=0;y<v.length;y++)""==v[y]||g.values.includes(v[y])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[y]),d.push(g.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(g.values.toString())}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#int"===g.type){var w=parseInt(f);(isNaN(w)||""+w!==f)&&(s.push(f),u.push(b))}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#decimal"==g.type){var k=parseFloat(f);isNaN(k)&&(s.push(f),u.push(b))}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#boolean"==g.type){var C=f.trim().toLowerCase();"true"!==C&&"false"!==C&&(s.push(f),u.push(b))}else g&&g.type&&"http://www.w3.org/2001/XMLSchema#string"==g.type||p--}}var x=new Array,P=0==u.length;return x.push(s.join(", ")),x.push(u.join(", ")),x.push(l.nodeName.toLowerCase()),0==p?null:P?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",x)}}},4974:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_label_unique.html",Fail_1:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"banner",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_banner_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_banner_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3054:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"banner")?null===n.AriaUtil.getSiblingWithRoleHidden(l,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},4649:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235),s=i(8656);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(l)||r.CommonUtil.isNodeDisabled(l)||n.AriaUtil.containsPresentationalChildrenOnly(l)||n.AriaUtil.shouldBePresentationalChild(l))){if(n.AriaUtil.hasRole(l,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(l.hasAttribute("class")&&"mbl"==l.getAttribute("class").substring(0,3))return null;if("datalist"===l.nodeName.toLowerCase())return null;var u=l.getAttribute("role").trim().toLowerCase().split(/\s+/),d=l.getAttribute("id");if(d&&d.trim().length>0){var c=l.ownerDocument.querySelector("*[aria-controls='".concat(d,"'][aria-haspopup='true'], *[aria-controls='").concat(d,"'][aria-expanded='true']")),m=["combobox","listbox","menu","menubar","radiogroup","tree","treegrid"];if(c&&r.CommonUtil.isTabbable(c)&&u&&u.length>0&&u.some((function(e){return m.includes(e)})))return null}for(var p=!0,h=l.ownerDocument,_=r.CommonUtil.hasAttribute,b=new Array,g="",f=!1,v=0;v<u.length;++v)if(o.ARIADefinitions.containers.includes(u[v])&&"true"!=(_(l,"aria-disabled")?l.getAttribute("aria-disabled"):"")&&!_(l,"aria-activedescendant")&&!r.CommonUtil.isTabbable(l)){var A=o.ARIADefinitions.designPatterns[u[v]].reqChildren;if(A){f=!0,p=!1;for(var y="descendant::*[",w=0;w<A.length;w++)y+="@role='"+A[w]+"' or ";y=y.substring(0,y.length-4)+"]";for(var k=h.evaluate(y,l,r.CommonUtil.defaultNSResolver,0,null),C=k.iterateNext();C&&!p;)if(r.CommonUtil.shouldNodeBeSkippedHidden(C))C=k.iterateNext();else{if(!(p=r.CommonUtil.isTabbable(C)))for(var x=h.evaluate("descendant::*",C,r.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P&&!p;)r.CommonUtil.shouldNodeBeSkippedHidden(P)||(p=r.CommonUtil.isTabbable(C)),P=x.iterateNext();p||(b=C.getAttribute("role").trim().split(" "),g=C.nodeName.toLowerCase()),C=k.iterateNext()}}}var R=new Array,T=new Array;return g.length>0&&b.length>0?(R.push(g),T.push(b.join(", "))):p=!0,f?p?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[R.toString(),T.toString()]):null}}}},4193:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&!n.AriaUtil.containsPresentationalChildrenOnly(l)){var s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length||(s=n.AriaUtil.getImplicitRole(l)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some((function(e){return u.includes(e)})))return null;if(s.includes("combobox"))return null;var d=n.AriaUtil.getRequiredChildRoles(l,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=n.AriaUtil.getDirectATChildren(l);if(!m||0==m.length){var p=l.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,_=0;_<m.length;_++){var b=n.AriaUtil.getRoles(m[_],!1);b&&0!=b.length||(b=n.AriaUtil.getImplicitRole(m[_])),b&&b.length>0&&(b.some((function(e){return d.includes(e)}))||h.push(b.join(", ")))}if(h.length>0){for(var g=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),g.push((0,a.RuleFail)("Fail_invalid_child",v))}return g}return(0,a.RulePass)("Pass")}}}},3188:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_unique.html",Fail_1:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"complementary",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_complementary_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_complementary_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},4176:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"complementary")?r.CommonUtil.attributeNonEmpty(l,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},7964:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(4377),l=i(4377),n=i(1421),r=i(8656);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.AccNameUtil.computeAccessibleName(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2554:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788),s=i(7440),u=i(8656),d=i(5755);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!l){(l={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<l.landmarks.value.length;++c)l.mapLandmarks[l.landmarks.value[c]]=!0;for(l.mapPossibleOrphanedWidgets={},c=0;c<l.possibleOrphanedWidgets.value.length;++c)l.mapPossibleOrphanedWidgets[l.possibleOrphanedWidgets.value[c]]=!0;for(l.mapPossibleOrphanedElements={},c=0;c<l.possibleOrphanedElements.value.length;++c)l.mapPossibleOrphanedElements[l.possibleOrphanedElements.value[c]]=!0;for(l.mapNoLandmarkedRoles={},c=0;c<l.noLandmarkedRoles.value.length;++c)l.mapNoLandmarkedRoles[l.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",l)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!r.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,_=n.AriaUtil.hasRole(m,l.mapPossibleOrphanedWidgets,!0);"link"===p&&(_=!1);var b=p in l.mapPossibleOrphanedElements;if(!_&&!b)return null;if(!(h=i.aria.map((function(e){return e.role})).filter((function(e){return e in l.mapLandmarks})).length>0)){for(var g=s.DOMWalker.parentElement(m);!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=s.DOMWalker.parentElement(g);for(g=m.nextElementSibling;!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=g.nextElementSibling;for(g=m.previousElementSibling;!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=g.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||n.AriaUtil.hasRole(m,l.mapNoLandmarkedRoles,!0)||n.AriaUtil.getAncestorWithRole(m,l.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},1229:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_label_unique.html",Fail_1:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"contentinfo",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_contentinfo_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_contentinfo_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},8523:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"contentinfo")?r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},3781:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"contentinfo")?n.AriaUtil.getSiblingWithRoleHidden(l,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},8509:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["307n5z"],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&n.AriaUtil.containsPresentationalChildrenOnly(l)){var s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length||(s=n.AriaUtil.getImplicitRole(l)),!s||0===s.length)return null;l.tagName.toLowerCase();var u=n.AriaUtil.getDirectATChildren(l);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=0;m<u.length;m++){var p=u[m].nodeName.toLowerCase();if("img"!==p&&"svg"!==p){var h=n.AriaUtil.getRoles(u[m],!1);h&&h.length>0?d.push(h.join(", ")):(h=n.AriaUtil.getImplicitRole(u[m]))&&h.length>0&&c.push(h.join(", "))}}if(d.length>0){for(var _=[],b=0;b<d.length;b++)(g=new Array).push(s.join(", ")),g.push(d[b]),_.push((0,a.RuleFail)("fail_child_explicit_role",g));return _}if(c.length>0){for(_=[],b=0;b<c.length;b++){var g;(g=new Array).push(s.join(", ")),g.push(c[b]),_.push((0,a.RulePotential)("potential_child_implicit_role",g))}return _}}}}},3234:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_document_label_unique.html",Fail_1:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"document",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_document_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_document_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""===d||!(d in u)||u[d]<=1?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},5217:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.getAncestor(l,"svg"))return null;if(n.AriaUtil.hasAnyRole(l,!0))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.isfocusableByDefault(l))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(l.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)l.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},4050:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_form_label_unique.html",Fail_1:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("form"===l.getAttribute("role")||l.hasAttribute("aria-label")||l.hasAttribute("aria-labelledby")||l.hasAttribute("title")){var s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"form",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_form_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_form_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}return null}}},4275:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(4377),l=i(490),n=i(8137),r=i(8656);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=l.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&n.CommonUtil.hasInnerContent(u)}return s||(s=n.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},1465:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(8137),l=i(4377),n=i(4377);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase();return a.CommonUtil.isTabbable(n)?(0,l.RuleFail)("Fail_1",[r]):(0,l.RulePass)("Pass_0")}}},405:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(482),s=i(8235),u=i(8656);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var l=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(l)),p=l.attributes,h=new Array,_=0;if(p)for(var b=0,g=p.length;b<g;b++){d=!0;var f=p[b].name;if(n.AriaUtil.isDefinedAriaAttribute(l,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){_++;var y=r.CommonUtil.normalizeSpacing(p[b].nodeValue).length,w=p[b].nodeValue.split(" ");if(y<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&y>=1&&w.length>1){d=!1;for(var k=0,C=w.length;k<C;++k)""!=w[k]&&h.push(w[k])}if(d&&y>=1)for(var x=0,P=w.length;x<P;++x)if(w[x].length>0){var R=m.getElementById(w[x]);if((d=null!=R)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(R)),d)break;""!=w[x]&&h.push(w[x])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,L=new Array;return T||(I.push(c.join(", ")),L.push(l.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==_?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),L.toString()])}}},9136:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(4377),l=i(490),n=i(8137),r=i(8656);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=l.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&n.CommonUtil.hasInnerContent(d)}return u||(u=n.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},5117:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235),s=i(8656);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)){var u=!0,d=u,c=l.ownerDocument,m=o.ARIADefinitions.designPatterns,p=n.AriaUtil.getRoles(l,!1);if("datalist"===l.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],_=0,b=h;_<b.length;_++){var g=b[_];if(null!=n.AriaUtil.getAncestorWithRole(l,g,!0))return null}for(var f=r.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(l,"aria-disabled")&&l.getAttribute("aria-disabled")||(u=l.hasAttribute("onkeydown")||l.hasAttribute("onkeypress")||l.hasAttribute("onkeyup"))))if(f(l,"aria-activedescendant"))u=!0;else{var y,w=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(w)for(var k=0,C=w.length;k<C;k++)for(var x="*[contains(@role,'"+w[k]+"')]",P=c.evaluate(x,l,r.CommonUtil.defaultNSResolver,0,null),R=P.iterateNext();R;){if(!(u=R.hasAttribute("onkeydown")||R.hasAttribute("onkeypress")))for(var T="descendant::*",U=(y=c.evaluate(T,R,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)r.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=y.iterateNext();if(!u)break;R=P.iterateNext()}else for(T="descendant::*",U=(y=c.evaluate(T,l,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(r.CommonUtil.shouldNodeBeSkippedHidden(U))U=y.iterateNext();else{var I;(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=y.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var L=new Array;L.push(l.nodeName.toLowerCase());var E=new Array;E.push(v.join(", "));var W=l.getAttribute("id");return W&&W.trim().length>0&&l.ownerDocument.querySelector("*[aria-controls='".concat(W,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[L.toString(),E.toString()])}}}},9062:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(4377),l=i(4377),n=i(4944),r=i(295),o=i(482),s=i(7788),u=i(1421);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"Pass_0",Fail_0:"Fail_0"}},help:{"en-US":{Pass_0:"aria_landmark_name_unique.html",Fail_0:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{Pass_0:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",Fail_0:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){for(var l=e.dom.node,d=l,c=[];d;)c.unshift(d),d=d.parentElement;c.forEach((function(e){if(null!==e&&("DIALOG"==e.tagName||"dialog"==e.getAttribute("role")))return null}));var m=o.FragmentUtil.getOwnerFragment(l),p=s.CacheUtil.getCache(l.ownerDocument,"aria_landmark_name_unique",null);if(!p){p={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var h=m.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),_=Array.from(h),b=[],g=[],f=[],v=0;v<_.length;v++){for(var A=_[v],y=!1;A;)null!==(A=A.parentElement)&&("DIALOG"!=A.tagName&&"dialog"!=A.getAttribute("role")||(y=!0));y||f.push(_[v])}for(_=f,v=0;v<_.length;v++){var w=[];for(A=_[v].parentElement;A;)w.push(A),A=A.parentElement;for(var k=0;k<w.length;k++){var C=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[k].tagName),x=!1;if(w[k].hasAttribute("role")&&(x=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[k].getAttribute("role"))),C||x){b.push(w[k]);break}if(k===w.length-1){b.push(null);break}}}var P=[];for(v=0;v<_.length;v++){var R=u.AccNameUtil.computeAccessibleName(_[v]);P.push(R&&R.name&&R.name.trim().length>0?R.name.trim():"")}for(v=0;v<b.length;v++){var T=!1,U=!1;for(k=0;k<b.length;k++)if(k!==v){if(null===b[v]&&null===b[k]){if(n.ARIAMapper.nodeToRole(_[v])===n.ARIAMapper.nodeToRole(_[k])){if(P[v]===P[k]){g.push("Fail_0"),T=!0;break}U=!0}}else if(null===b[v]||null===b[k])continue;if(r.DOMUtil.sameNode(b[v],b[k])&&n.ARIAMapper.nodeToRole(_[v])===n.ARIAMapper.nodeToRole(_[k])){if(P[v]===P[k]){g.push("Fail_0"),T=!0;break}U=!0}}T||(U?g.push("Pass_0"):g.push("null"))}p.navigationNodesComputedLabels=P,p.navigationNodes=_,p.navigationNodesParents=b,p.navigationNodesMatchFound=g,s.CacheUtil.setCache(l.ownerDocument,"aria_landmark_name_unique",p)}var I=-1;for(v=0;v<p.navigationNodes.length;v++)l.isSameNode(p.navigationNodes[v])&&(I=v);return-1===I?null:"Pass_0"===p.navigationNodesMatchFound[I]?(0,a.RulePass)("Pass_0",[n.ARIAMapper.nodeToRole(p.navigationNodes[I])]):"Fail_0"===p.navigationNodesMatchFound[I]?(0,a.RuleFail)("Fail_0",[n.ARIAMapper.nodeToRole(p.navigationNodes[I]),p.navigationNodesComputedLabels[I]]):null}}},5746:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){for(var l=e.dom.node,o=n.AriaUtil.getAriaLabel(l),s=n.AriaUtil.getAncestorWithRole(l,"document",!0),u=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0),d=null,c=0;c<u.length;++c)if(u[c]!==l&&(d=(0,a.RulePass)("Pass_0"),n.AriaUtil.getAncestorWithRole(u[c],"document",!0)===s&&n.AriaUtil.getAriaLabel(u[c])===o)){d=(0,a.RuleFail)("Fail_1");break}return d}}},8685:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0);return 0===o.length||1===o.length?null:n.AriaUtil.hasUniqueAriaLabelledby(o)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2678:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_navigation_label_unique.html",Fail_1:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"navigation",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_navigation_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_navigation_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},971:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(4377),l=i(4377),n=i(8235),r=i(490),o=i(8137),s=i(8656);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var l=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(l)||o.CommonUtil.isNodeDisabled(l)||r.AriaUtil.shouldBePresentationalChild(l)||s.VisUtil.isNodePresentational(l))){for(var u=!0,d=n.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map((function(e){return e.role})),_=h[h.length-2],b=2;"none"===_;)b++,_=h[h.length-b];var g=r.AriaUtil.getResolvedRole(l);if(d[g]&&null!=d[g].container){p++,u=!1;for(var f=0,v=(m=d[g].container).length;!u&&f<v&&!(u=_===m[f]);f++);0==u&&c.push(g)}var A=new Array;A.push(c.join(", "));var y=new Array;return y.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),y.toString()])}}}},3709:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_label_unique.html",Fail_1:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("region"===l.getAttribute("role")||l.hasAttribute("aria-label")||l.hasAttribute("aria-labelledby")&&!r.CommonUtil.isIdReferToSelf(l,l.getAttribute("aria-labelledby"))||l.hasAttribute("title")){var s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"region",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_region_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_region_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}return null}}},6486:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(l)?null:n.AriaUtil.hasAriaLabel(l)||r.CommonUtil.attributeNonEmpty(l,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4151:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var l=e.dom.node,r=l.getAttribute("role").trim().toLowerCase();if(0===r.length)return null;if(l.hasAttribute("aria-hidden")&&"true"===l.getAttribute("aria-hidden").toLowerCase())return null;var o=n.AriaUtil.getRolesUndefinedByAria(l);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=r.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},8545:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(5755);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.tagName.toLowerCase(),s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length){if(!n.AriaUtil.areRolesDefined(s))return null;if(["td","th","tr"].includes(o)){var u=r.TableUtil.isTableDescendant(i);if(null!==u&&u.length>0)return null}var d=n.AriaUtil.getImplicitRole(l);if(!d||0===d.length)return(0,a.RulePass)("pass");for(var c=[],m=0;m<s.length;m++)d.includes(s[m])?c.push((0,a.RuleFail)("fail_redundant",[s[m],o])):c.push((0,a.RulePass)("pass"));return c.length>0?c:null}}}},8538:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_search_label_unique.html",Fail_1:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"search",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_search_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_search_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},1908:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.tagName.toLowerCase();if(1!==l.nodeType)return null;var s=n.AriaUtil.getRolesUndefinedByAria(l);if(s&&s.length>0)return null;var u=n.AriaUtil.getDeprecatedAriaRoles(l);if(u&&u.length>0)return null;var d=n.AriaUtil.getDeprecatedAriaAttributes(l);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=r.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=n.AriaUtil.getUserDefinedRoles(l);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=n.AriaUtil.getInvalidRoles(l);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&r.CommonUtil.isTabbable(l)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(1!==l.nodeType)return null;var r=n.AriaUtil.getUserDefinedAriaAttributes(l);if(null===r||0===r.length)return null;var o=n.AriaUtil.getUserDefinedRoles(l),s=!0;if(o&&o.length>0){if(!n.AriaUtil.areRolesDefined(o))return null}else o=n.AriaUtil.getImplicitRole(l),s=!1;var u=l.tagName.toLowerCase(),d=n.AriaUtil.getInvalidAriaAttributes(l);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[r.join(", "),u,o.join(", ")])}}},6360:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_toolbar_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_toolbar_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},5386:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(4944),s=i(482),u=i(8235),d=i(295);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var l=e.dom.node;if(l.hasAttribute("type")&&"hidden"===l.getAttribute("type")||n.AriaUtil.getAncestorWithRole(l,"combobox")&&!n.AriaUtil.hasRoleInSemantics(l,"textbox")&&!n.AriaUtil.hasRoleInSemantics(l,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(l),m=l.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&l.getAttribute("type"),!l.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(l.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(n.AriaUtil.hasRoleInSemantics(l,p[h]))for(var _=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"combobox",!0,!0),b=0;b<_.length;b++){var g=_[b],f=r.CommonUtil.getElementAttribute(g,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(l,v[A])===l)return null}for(var y=!0,w=u.ARIADefinitions.designPatterns,k=n.AriaUtil.getRoles(l,!0),C=0,x=["widget","liveRegion","window"],P=(A=0,k.length);y&&A<P;++A){var R=w[k[A]];R&&R.nameRequired&&R.roleType&&x.includes(R.roleType)&&(++C,!(y=n.AriaUtil.hasAriaLabel(l)||r.CommonUtil.attributeNonEmpty(l,"title")||r.CommonUtil.getLabelForElementHidden(l,!0))&&R.nameFrom&&R.nameFrom.indexOf("contents")>=0&&(y=r.CommonUtil.hasInnerContentOrAlt(l)),y||(y=r.CommonUtil.hasImplicitLabel(l)),y||"img"!==l.tagName.toLowerCase()||l.hasAttribute("role")||!l.hasAttribute("alt")||(y=d.DOMUtil.cleanWhitespace(l.getAttribute("alt")).trim().length>0),R.nameFrom.indexOf("prohibited"))}return 0===C?null:y?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},8752:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(4377),l=i(8137);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if("pre"==n.nodeName.toLowerCase()&&(n.previousSibling&&"code"==n.previousSibling.nodeName.toLowerCase()||n.getElementsByTagName("code").length>0||l.CommonUtil.getAncestor(n,"code")))return(0,a.RulePass)("Pass_0");for(var r=!0,o=l.CommonUtil.getInnerText(n),s=0,u=0,d="",c=0;r&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},4392:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(4377),l=i(4377),n=i(8137);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getInnerText(l);l.hasAttribute("style")&&(r=l.getAttribute("style"));var o=-1==r.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},932:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(4377),l=i(4377);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},6255:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(4377),l=i(4377),n=i(8137);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"cite");if(!r){var o=n.CommonUtil.getDocElementsByTag(l,"cite");r=null!=o&&o.length>0}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5743:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(4377),l=i(4377),n=i(8656);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.innerHTML.trim().length>0;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RuleManual)("Manual_1")}}},2671:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(4377),l=i(4377);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!1;if("true"===l.getAttribute("aria-hidden"))return null;for(var r=l.getElementsByTagName("track"),o=0;o<r.length;++o)n=n||"captions"===r[o].getAttribute("kind");if(l.textTracks&&l.textTracks.length>0)for(o=0;o<l.textTracks.length;o++)n=n||"captions"===l.textTracks[o].kind;return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},3974:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(482),o=i(7440),s=i(7788),u=i(8656);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,d=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=l.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var _=r.FragmentUtil.getById(l,h);if(!_)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var g=new o.DOMWalker(m);!b&&g.nextNode()&&g.node!=m&&g.node!=m.nextSibling;)1===g.node.nodeType&&u.VisUtil.isNodeVisible(g.node)&&(b=g.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=n.AriaUtil.getRoles(_,!0);return 0===["option","gridcell","row","treeitem"].filter((function(e){return v.includes(e)})).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==_.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},9881:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(7788),o=i(8656);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===l.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new n.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},1226:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656),s=i(7788);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;var u,d="select"===(u=l).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=l.tagName.toLowerCase(),m="true"===(n.AriaUtil.getAriaAttribute(l,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!l.hasAttribute("type")||"text"===l.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var _=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});return _?(_[h]={inputElement:p?l:null,pattern:d,expanded:m},s.CacheUtil.setCache(l.ownerDocument,"combobox",_),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},7369:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(490),o=i(8137),s=i(7788),u=i(8656);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,d=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=r.AriaUtil.getRoles(m,!0)[0],_=[];if(o.CommonUtil.isTabbable(l)||_.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!r.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var g=new n.DOMWalker(m);b&&g.nextNode()&&(1!==g.node.nodeType||!u.VisUtil.isNodeVisible(g.node)||(b=!o.CommonUtil.isTabbable(g.node)&&!r.AriaUtil.getAriaAttribute(g.node,"aria-activedescendant"),!g.bEndTag||g.node!==m.lastElementChild)););return b||_.push((0,a.RuleFail)("Fail_tabbable_child")),0===_.length?(0,a.RulePass)("Pass"):_}}},2633:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(7788);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=n.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter((function(e){return c.includes(e)}));if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=l.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!l.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},2429:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(4377),l=i(4377),n=i(482),r=i(7788),o=i(8656);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var l=e.dom.node,s=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!l.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=l.getAttribute("aria-owns"),!(c=n.FragmentUtil.getById(l,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!l.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=l.getAttribute("aria-controls"),!(c=n.FragmentUtil.getById(l,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},7874:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(4377);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},3334:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(8137),l=i(4377),n=i(4377);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:n.eRulePolicy.INFORMATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(!a.CommonUtil.isTabbable(n))return null;var r=i.aria[i.aria.length-1];return(0,l.RulePass)("Pass_0",[],[{name:r.attributes.name,role:r.role,tabindex:parseInt(n.getAttribute("tabindex")||"0")}])}}},4298:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(4377),l=i(4377);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==l||"rtl"==l||"auto"==l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4435:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=l.getAttribute("href"),s=n.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},1685:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(8656);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;var o=n.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(n,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===n.getAttribute("draggable")?(0,l.RulePotential)("potential_alternative",[o]):"false"===n.getAttribute("draggable")?(0,l.RulePass)("pass_undraggable",[o]):null}}},6313:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656),s=i(8235),u=i(1421);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeVisible(l)&&!r.CommonUtil.isNodeDisabled(l)&&!r.CommonUtil.isTabbable(l)){var d=n.AriaUtil.getRoles(l,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!l.parentElement||"fieldset"!==l.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(l);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},9109:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(4377),l=i(4377),n=i(7788);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CacheUtil.getCache(l.ownerDocument,"element_accesskey_unique",{}),o=l.getAttribute("accesskey"),s=!(o in r);return r[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},9918:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(4377),l=i(4377),n=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],r=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("tbody"===l.nodeName.toLowerCase()&&l.hasAttribute("align"))return(0,a.RulePass)("pass");if(l.nodeName.includes("-"))return null;var s=l.nodeName.toLowerCase();if(n.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=l.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];r.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,_=u;h<_.length;h++)p=_[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},8105:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(4377),l=i(4377),n=i(482);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{group:"element_id_unique.html",Pass_0:"element_id_unique.html",Fail_1:"element_id_unique.html",Fail_2:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",Pass_0:"Rule Passed",Fail_1:'The <{0}> element has the id "{1}" that is empty',Fail_2:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail"}}],run:function(e,t,i){var l=e.dom.node,r=l.getAttribute("id");return""===r?(0,a.RuleFail)("Fail_1",[l.nodeName.toLowerCase(),r]):n.FragmentUtil.getById(l,r)===l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[l.nodeName.toLowerCase(),r])}}},8687:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(4377),l=i(4377),n=i(2527),r=i(8656),o=i(7440),s=i(1421),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!n.LangUtil.validPrimaryLang(a))return 1;if(!n.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!n.LangUtil.validPrimaryLang(a))return 3;if(!n.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var l=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][l]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var l=e.dom.node;if("html"===l.nodeName.toLowerCase())return null;var n=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==l.firstChild)for(var m=new o.DOMWalker(l,!1,l,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!r.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},2150:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(4377),l=i(4377);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,n=l.nodeName.toLowerCase(),r=l.hasAttribute("href")||!l.hasAttribute("ondblclick")&&!l.hasAttribute("onmousemove")&&(!l.hasAttribute("onmousedown")||l.hasAttribute("onkeydown"))&&(!l.hasAttribute("onmouseup")||l.hasAttribute("onkeyup"))&&(!l.hasAttribute("onmouseover")||l.hasAttribute("onfocus"))&&(!l.hasAttribute("onmouseout")||l.hasAttribute("onblur"))&&(!l.hasAttribute("onclick")||l.hasAttribute("onkeypress")||"a"==n||"button"==n),o=new Array;return r||(l.hasAttribute("ondblclick")&&o.push("ondblclick"),l.hasAttribute("onmousemove")&&o.push("onmousemove"),l.hasAttribute("onmousedown")&&!l.hasAttribute("onkeydown")&&o.push("onmousedown"),l.hasAttribute("onmouseup")&&!l.hasAttribute("onkeyup")&&o.push("onmouseup"),l.hasAttribute("onmouseover")&&!l.hasAttribute("onfocus")&&o.push("onmouseover"),l.hasAttribute("onmouseout")&&!l.hasAttribute("onblur")&&o.push("onmouseout"),l.hasAttribute("onclick")&&!l.hasAttribute("onkeypress")&&"a"!=n&&"button"!=n&&o.push("onclick")),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[n,o.join(", ")])}}},4557:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(4377),l=i(4377),n=i(1775),r=i(8656),o=i(7788),s=i(482),u=i(8137);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;if(u.CommonUtil.getAncestor(l,["script","meta","title"]))return null;var d=l.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(l),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=n.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach((function(e){Object.keys(m[e]).forEach((function(t){Object.keys(m[e][t]).length>0&&n.CSSUtil.selectorMatchesElem(l,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))}))})),0===p.length)return null;for(var h=[],_=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var r=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach((function(e){t.includes(e)&&(r=!0)})),!r)return"continue";var o=n.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=n.CSSUtil.getDefinedStyles(l);s.transform&&(o+=n.CSSUtil.getRotationDegree(s.transform)),Math.abs(o-360)%360>1?h.push((0,a.RuleFail)("fail_locked",[d])):h.push((0,a.RulePass)("pass"))},b=0;b<p.length;b++)_(b);return h.length>0?h:null}}},4721:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(8656),o=i(1775);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["0ssw9k"],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeVisible(n)&&!a.CommonUtil.isNodeDisabled(n)){if(a.CommonUtil.getAncestor(n,["iframe","svg","script","meta"]))return null;if(!a.CommonUtil.hasInnerContent(n))return null;var s=n.nodeName.toLowerCase(),u=getComputedStyle(n);if(!("visible"!==u.overflowX&&"hidden"!==u.overflowX||"visible"!==u.overflowY&&"hidden"!==u.overflowY))return null;if(Math.max(n.offsetWidth,n.offsetHeight)<30||Math.min(n.offsetWidth,n.offsetHeight)<15)return null;var d=o.CSSUtil.getPixelsFromStyle(u.paddingLeft,n)+o.CSSUtil.getPixelsFromStyle(u.paddingRight,n),c=o.CSSUtil.getPixelsFromStyle(u.paddingTop,n)+o.CSSUtil.getPixelsFromStyle(u.paddingBottom,n);return n.scrollWidth-n.clientWidth<1+d&&n.scrollHeight-n.clientHeight<1+c?null:a.CommonUtil.isTabbable(n)?(0,l.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(n)>0?(0,l.RulePass)("pass_interactive"):!n.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,l.RuleFail)("fail_scrollable",[s])}}}},2814:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235),s=i(1775),u=i(7440),d=i(8656);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.isNodeDisabled(l)||d.VisUtil.isNodeHiddenFromAT(l))return null;var c=l.nodeName.toLowerCase();if(c in r.CommonUtil.tabTagMap){var m=r.CommonUtil.tabTagMap[c];if("function"==typeof m&&(m=m(l)),m)return null}if(!l.hasAttribute("tabindex")||parseInt(l.getAttribute("tabindex"))<0)return null;var p=s.CSSUtil.getDefinedStyles(l);if("scroll"===p["overflow-x"]||"scroll"===p["overflow-y"]||"auto"===p["overflow-x"]||"auto"===p["overflow-y"])return null;var h=u.DOMWalker.parentNode(l),_=n.AriaUtil.getResolvedRole(h);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(_))return null;var b=n.AriaUtil.getResolvedRole(l);return b?"application"===b?null:"row"===b||"separator"===b||"widget"===o.ARIADefinitions.designPatterns[b].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[b]):(0,a.RuleFail)("fail_no_valid_role")}}},9188:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(8656),o=i(5697);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n)||!a.CommonUtil.isTabbable(n))return null;var s=n.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(n,["pre","code","script","meta"])||"body"===s||"html"===s)return null;var u=new o.DOMMapper,d=u.getUnadjustedBounds(n);if(!d)return null;if(0===d.height||0===d.width)return null;var c=n.ownerDocument;if(!c)return null;var m=c.defaultView;if(!m)return null;var p=m.getComputedStyle(n);if(null===p)return null;var h=p.zIndex;h&&"auto"!==h||(h="0");var _=c.querySelectorAll("body *:not(script)");if(_&&0!=_.length){var b=[],g=!0;return _.forEach((function(e){if(n.contains(e))g=!1;else if(r.VisUtil.isNodeVisible(e)&&!e.contains(n)){var t=u.getUnadjustedBounds(e),i=m.getComputedStyle(e),a="0";i&&((a=i.zIndex)&&!isNaN(Number(a))||(a="0")),0!==t.height&&0!==t.width&&t.top<=d.top&&t.left<=d.left&&t.top+t.height>=d.top+d.height&&t.left+t.height>=d.left+d.width&&(g?parseInt(h)<parseInt(a):parseInt(h)<=parseInt(a))&&b.push(e)}})),b.length>0?(0,l.RulePotential)("potential_obscured",[]):(0,l.RulePass)("pass")}}}},7601:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(8137),l=i(1775),n=i(4377),r=i(4377),o=i(5697);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var s=r.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(r);if(!u)return null;var d=l.CSSUtil.getDefinedStyles(r),c=l.CSSUtil.getDefinedStyles(r,":focus");if(0===u.height||0===u.width)return(0,n.RulePotential)("potential_visible",[]);if("absolute"===d.position&&d.clip&&"rect(0px,0px,0px,0px)"===d.clip.replaceAll(" ","")&&!c.clip){if("input"===s&&("checkbox"===r.getAttribute("type")||"radio"===r.getAttribute("type"))){var m=a.CommonUtil.getLabelForElement(r);if(m&&!a.CommonUtil.isInnerTextEmpty(m)){var p=l.CSSUtil.getDefinedStyles(r,":focus"),h=l.CSSUtil.getDefinedStyles(r,":focus-visible"),_=l.CSSUtil.getDefinedStyles(r,":focus-within"),b=l.CSSUtil.getDefinedStyles(r,":checked");if(p||h||_||b)return(0,n.RulePass)("pass")}}return(0,n.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,n.RulePass)("pass");var g=getComputedStyle(r),f=u.top,v=u.left;if(0===Object.keys(c).length)return(0,n.RulePotential)("potential_visible",[]);var A=["absolute","fixed"];return void 0!==c.top&&(f=A.includes(c.position)||void 0===c.position&&A.includes(g.position)?c.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==c.left&&(v=A.includes(c.position)||void 0===c.position&&A.includes(g.position)?c.left.replace(/\D/g,""):Number.MIN_VALUE),f>=0&&v>=0?(0,n.RulePass)("pass"):(0,n.RulePotential)("potential_visible",[])}}},4497:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.CommonUtil.attributeNonEmpty(l,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},152:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.embed_noembed_exists=void 0;var a=i(4377),l=i(4377);t.embed_noembed_exists={id:"embed_noembed_exists",context:"dom:embed",refactor:{WCAG20_Embed_HasNoEmbed:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_noembed_exists.html",Potential_1:"embed_noembed_exists.html",group:"embed_noembed_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element is immediately followed by a non-embedded element",group:"<embed> elements should be immediately followed by a non-embedded element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node,n=l.getElementsByTagName("noembed").length>0;if(!n)for(var r=l.nextSibling;!n&&null!==r;){if("noembed"==r.nodeName.toLowerCase())n=!0;else{if("#text"==r.nodeName.toLowerCase()&&r.nodeValue.trim().length>0)break;if(1==r.nodeType)break}r=r.nextSibling}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},935:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(4377),l=i(8137);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var n=e.dom.node,r=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=n.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<r.length;++d)for(var c=s.indexOf(r[d]),m=r[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==r[d]||"(:"==r[d])&&/\(\:.*\:\)/.test(s))||(";)"==r[d]||"(;"==r[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(r[d],c+1);if(!o){var p=l.CommonUtil.getAncestor(n,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},9719:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(482),o=i(8656);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=n.AriaUtil.getAriaAttribute(l,"aria-errormessage");if(!s)return null;var u=r.FragmentUtil.getById(l,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},5625:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(4377),l=i(4377),n=i(482),r=i(7788),o=i(8137),s=i(8656),u=i(1421);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)&&!o.CommonUtil.isNodeDisabled(l)){var d=n.FragmentUtil.getOwnerFragment(l),c=r.CacheUtil.getCache(l.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],_=0;_<p.length;_++)p[_].querySelector("input")&&h.push(p[_]);var b=[];for(_=0;_<h.length;_++){var g=u.AccNameUtil.computeAccessibleName(h[_]);b.push(g&&g.name&&g.name.trim().length>0?g.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,r.CacheUtil.setCache(l.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(_=0;_<c.groupsWithInputs.length;_++)if(l.isSameNode(c.groupsWithInputs[_])){if(f=!0,""===c.groupsWithInputsComputedLabels[_]||null===c.groupsWithInputsComputedLabels[_])return(0,a.RuleFail)("Fail_1");for(var A=!1,y=0;y<c.groupsWithInputsComputedLabels.length;y++)_!=y&&c.groupsWithInputsComputedLabels[_]===c.groupsWithInputsComputedLabels[y]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[_]]);v=c.groupsWithInputsComputedLabels[_]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},9115:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l)||n.CommonUtil.isNodeDisabled(l))return null;var o=n.CommonUtil.getChildByTagHidden(l,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===n.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},6072:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(4377),l=i(4377),n=i(8656),r=i(1421);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(l.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},6923:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(4377),l=i(4377);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=!0,n=e.dom.node.getElementsByTagName("font");if(null!=n)for(var r=0;r<n.length;++r)l=!n[r].hasAttribute("color");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},9015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(4377),l=i(4377),n=i(8137);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l={paramWinText:{value:["new window"],type:"array"}},r=e.dom.node,o=r.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=n.CommonUtil.getFrameByName(r,o);if(!s){var u=n.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(u+=" "+r.getAttribute("title"));for(var d=0;!s&&d<l.paramWinText.value.length;++d)-1!=u.indexOf(l.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},3611:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(4377),l=i(4377),n=i(482),r=i(7788);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CacheUtil.getCache(n.FragmentUtil.getOwnerFragment(l),"RPT_Label_Single",{}),s=l.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4846:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(7440);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=!1;if(l.firstChild)for(var s=new r.DOMWalker(l,!0);!o&&s.prevNode()&&s.node!=l;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=n.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3277:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(4377);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var l=0===e.dom.node.getAttribute("onchange").trim().length;return l?null:l?void 0:(0,a.RulePotential)("Potential_1")}}},4525:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"src")&&n.CommonUtil.isHtmlExt(n.CommonUtil.getFileExt(l.getAttribute("src")));return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7114:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(4377),l=i(4377),n=i(1421),r=i(8656);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;if(l.getAttribute("role"))return null;var o=n.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3751:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(4377),l=i(4377),n=i(8137);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.CommonUtil.hasInnerContentHidden(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7084:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(4377),l=i(4377),n=i(8137);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.wordCount(n.CommonUtil.getInnerText(l))<=20;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3981:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(4377),l=i(4377),n=i(9193),r=i(2527);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(n.AncestorUtil.isPresentationFrame(i))return null;var l=e.dom.node,o=l.ownerDocument.doctype?l.ownerDocument.doctype.publicId:"";o||(o="");var s=l.getAttribute("lang"),u=l.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},9788:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(482);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=!1,s=n.CommonUtil.getDocElementsByTag(l,"frame"),u=n.CommonUtil.getDocElementsByTag(l,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=n.CommonUtil.getDocElementsByTag(l,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,_="";if((h=void 0!==l.ownerDocument.locationFromDAP&&null!=l.ownerDocument.locationFromDAP?l.ownerDocument.locationFromDAP:l.ownerDocument.location)&&(_=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),_.startsWith("file:///")&&(_="file:/"+_.substring(8)),"#"==p.charAt(0)||p.startsWith(_+"#")){var b=n.CommonUtil.getFileAnchor(p);null!=r.FragmentUtil.getById(l,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var g=d[m].getAttribute("name");-1!=g.indexOf("#")&&(g=n.CommonUtil.getFileAnchor(g)),o=g in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4419:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(8656),o=i(5697);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeHiddenFromAT(n)&&!a.CommonUtil.isNodeDisabled(n)){var s=(new o.DOMMapper).getUnadjustedBounds(n);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))>=0)return(0,l.RulePass)("pass");var u=n;return u&&u.contentDocument&&u.contentDocument.documentElement&&a.CommonUtil.getTabbableChildren(n)>0?(0,l.RuleFail)("fail_invalid"):null}}}},2575:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var l=e.dom.node;return l.hasAttribute("type")&&"image"==l.getAttribute("type").toLowerCase()?r.CommonUtil.attributeNonEmpty(l,"alt")?(0,a.RulePass)("Pass_0"):n.AriaUtil.hasAriaLabel(l)?(0,a.RulePass)("Pass_1"):l.hasAttribute("title")&&l.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},8124:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.CommonUtil.attributeNonEmpty(l,"alt")||!l.hasAttribute("ismap")&&!n.CommonUtil.attributeNonEmpty(l,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3440:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(4377),l=i(4377),n=i(8656);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.ownerDocument.defaultView.getComputedStyle(l);if(null==r)return(0,a.RulePass)("Pass_0");var o=r.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=l.innerHTML&&0!=l.innerHTML.trim().length)s=!1;else{var u=l.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},2193:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8656);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=!0;return(n.AriaUtil.hasRole(l,"presentation")||n.AriaUtil.hasRole(l,"none"))&&(o=0==l.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},309:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(4377),l=i(4377),n=i(8656);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.nodeName.toLowerCase(),o=!0;if(l.hasAttribute("alt")){var s=l.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=l.getAttribute("area"==r?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},6281:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(4377),l=i(4377),n=i(8656),r=i(490),o=i(8137);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var l=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(l)||l.getAttribute("alt").trim().length>0?null:r.AriaUtil.getAriaLabel(l).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(l,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},7748:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(8137);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CommonUtil.getAncestor(l,"a");if(null==o)return null;var s=l.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new n.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new n.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8856:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8656);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;if(0!==n.AriaUtil.getAriaLabel(l).trim().length)return(0,a.RulePass)("pass");var o=l.hasAttribute("alt")?l.getAttribute("alt"):null;if(null!==o)return 0===o.length||o.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var s=l.hasAttribute("title")?l.getAttribute("title"):null;if(null!==s&&0!==s.length)return 0===s.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===o){var u=n.AriaUtil.getResolvedRole(l,!1);return"presentation"===u||"none"===u?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===o.length?(0,a.RulePass)("pass"):void 0}}},7393:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=!1;if(l.hasAttribute("usemap")){var s=l.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=n.CommonUtil.getDocElementsByTag(l,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},9410:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=l.getAttribute("longdesc"),s=n.CommonUtil.getFileExt(o),u=0!=s.length&&n.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},8081:function(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var l=Object.getOwnPropertyDescriptor(t,i);l&&!("get"in l?!t.__esModule:l.writable||l.configurable)||(l={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,l)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),l=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),l(i(8980),t),l(i(3961),t),l(i(1445),t),l(i(876),t),l(i(2768),t),l(i(2533),t),l(i(7178),t),l(i(9745),t),l(i(8019),t),l(i(6505),t),l(i(8910),t),l(i(3492),t),l(i(5316),t),l(i(8412),t),l(i(172),t),l(i(9844),t),l(i(9695),t),l(i(1699),t),l(i(4974),t),l(i(3054),t),l(i(4649),t),l(i(4193),t),l(i(3188),t),l(i(4176),t),l(i(7964),t),l(i(2554),t),l(i(1229),t),l(i(8523),t),l(i(3781),t),l(i(8509),t),l(i(3234),t),l(i(5217),t),l(i(4050),t),l(i(4275),t),l(i(1465),t),l(i(405),t),l(i(9136),t),l(i(5117),t),l(i(9062),t),l(i(5746),t),l(i(8685),t),l(i(2678),t),l(i(971),t),l(i(3709),t),l(i(6486),t),l(i(4151),t),l(i(8545),t),l(i(8538),t),l(i(1908),t),l(i(6360),t),l(i(5386),t),l(i(8752),t),l(i(4392),t),l(i(932),t),l(i(6255),t),l(i(5743),t),l(i(2671),t),l(i(3974),t),l(i(9881),t),l(i(1226),t),l(i(7369),t),l(i(2633),t),l(i(2429),t),l(i(7874),t),l(i(3334),t),l(i(4298),t),l(i(4435),t),l(i(1685),t),l(i(6313),t),l(i(9109),t),l(i(9918),t),l(i(8105),t),l(i(8687),t),l(i(2150),t),l(i(4557),t),l(i(4721),t),l(i(2814),t),l(i(9188),t),l(i(7601),t),l(i(4497),t),l(i(152),t),l(i(935),t),l(i(9719),t),l(i(5625),t),l(i(9115),t),l(i(6072),t),l(i(6923),t),l(i(9015),t),l(i(3611),t),l(i(4846),t),l(i(3277),t),l(i(4525),t),l(i(7114),t),l(i(3751),t),l(i(7084),t),l(i(3981),t),l(i(9788),t),l(i(4419),t),l(i(2575),t),l(i(8124),t),l(i(3440),t),l(i(2193),t),l(i(309),t),l(i(6281),t),l(i(7748),t),l(i(8856),t),l(i(7393),t),l(i(9410),t),l(i(8589),t),l(i(3366),t),l(i(8929),t),l(i(5403),t),l(i(5937),t),l(i(4452),t),l(i(7209),t),l(i(8262),t),l(i(7017),t),l(i(9980),t),l(i(7733),t),l(i(1256),t),l(i(9532),t),l(i(6698),t),l(i(9632),t),l(i(3692),t),l(i(5430),t),l(i(1018),t),l(i(3433),t),l(i(8012),t),l(i(3881),t),l(i(3106),t),l(i(1276),t),l(i(5424),t),l(i(4248),t),l(i(9526),t),l(i(9379),t),l(i(5495),t),l(i(7753),t),l(i(1252),t),l(i(3576),t),l(i(3617),t),l(i(6110),t),l(i(5681),t),l(i(1922),t),l(i(7906),t),l(i(5451),t),l(i(6349),t),l(i(5393),t),l(i(9887),t),l(i(5102),t),l(i(9977),t),l(i(8454),t),l(i(25),t),l(i(2884),t),l(i(5390),t),l(i(7196),t),l(i(9965),t),l(i(4468),t),l(i(4451),t),l(i(6087),t),l(i(5864),t),l(i(4066),t),l(i(2841),t),l(i(272),t),l(i(1348),t),l(i(6215),t),l(i(5275),t),l(i(7900),t),l(i(5027),t),l(i(3496),t),l(i(1131),t),l(i(8681),t),l(i(4577),t),l(i(8051),t)},8589:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l)||n.CommonUtil.isNodeDisabled(l))return null;var o=l.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=l.nodeName.toLowerCase();if(!s.every((function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)})))return(0,a.RuleFail)("fail_incorrect");var _=l.hasAttribute("type")?l.getAttribute("type").trim().toLowerCase():"text",b=[],g=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,g=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,_){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),g=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,g=u.tokensMandatoryGroup2_url;break;case"email":g=u.tokensMandatoryGroup2_email;break;case"tel":g=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,g.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},3366:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7440),s=i(7788),u=i(8656),d=i(5755);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(l))return null;var c=function(e){var t=r.CommonUtil.getAncestor(e,"fieldset")||n.AriaUtil.getAncestorWithRole(e,"radiogroup")||n.AriaUtil.getAncestorWithRole(e,"group")||n.AriaUtil.getAncestorWithRole(e,"grid")||n.AriaUtil.getAncestorWithRole(e,"table");return t||(t=r.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=l.getAttribute("type").toLowerCase(),p=n.AriaUtil.getAncestorWithRole(l,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var _=new o.DOMWalker(p,!1,p,!0),b=[],g=[];_.nextNode();)if(!_.bEndTag&&1===_.node.nodeType&&"input"===_.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(_.node)){var f=_.node.getAttribute("type");"checkbox"===f?b.push(_.node):"radio"===f&&g.push(_.node)}for(var v=0;v<b.length;++v){var A=b[v];if((n.AriaUtil.getAncestorWithRole(A,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(A)){var y=A.getAttribute("name")||"";(h.checkboxByName[y]=h.checkboxByName[y]||[]).push(A),h.nameToGroup[y]=h.nameToGroup[y]||c(A),++h.numCheckboxes}}for(v=0;v<g.length;++v){var w=g[v];if((n.AriaUtil.getAncestorWithRole(w,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(w)){var k=w.getAttribute("name")||"";(h.radiosByName[k]=h.radiosByName[k]||[]).push(w),h.nameToGroup[k]=h.nameToGroup[k]||c(w),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var C=l.getAttribute("name"),x=c(l);if(m="radio"===m?"Radio":"Checkbox",C&&""!==C){var P=(h.radiosByName[C]||[]).length,R=(h.checkboxByName[C]||[]).length;return P>0&&R>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",C]):"Radio"===m&&(1===h.numRadios||1===P)||"Checkbox"===m&&1===h.numCheckboxes?null===x?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===R?null===x?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===x?null!==h.nameToGroup[C]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,C]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,C]):h.nameToGroup[C]!==x?(0,a.RuleFail)("fail_notsamegroup",[m,C]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===x?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===x?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},8929:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(4377),l=i(4377),n=i(8137);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")&&"text"!=(m=l.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=n.CommonUtil.getAncestor(l,"fieldset"))return(0,a.RulePass)("Pass_0");for(var r=n.CommonUtil.getAncestor(l,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=r.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!n.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==l||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},5403:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(l)||r.CommonUtil.isNodeDisabled(l))return null;var s=n.AriaUtil.getUserDefinedRoles(l);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=l.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=l.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=l.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},5937:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(8137);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o="";if(l.hasAttribute("type")&&(o=l.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=r.CommonUtil.getLabelForElementHidden(l,!0);if(null===s||!r.CommonUtil.hasInnerContentHidden(s))return null;var u,d=r.CommonUtil.compareNodeOrder(s,l);if(-2===d){u=!1;var c=new n.DOMWalker(s);for(c.node=l;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},4452:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(4377),l=i(4377),n=i(8137);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")){var r=l.getAttribute("type").toLowerCase();if("text"!=r&&"file"!=r&&"password"!=r)return null}var o=n.CommonUtil.getLabelForElementHidden(l,!0);if(null==o||!n.CommonUtil.hasInnerContentHidden(o))return null;var s=n.CommonUtil.compareNodeOrder(o,l);if(-2===s){var u=n.CommonUtil.getInnerText(l);if(u&&u.trim().length>0&&n.CommonUtil.getInnerText(l).trim()===u.trim())return null;for(var d=!1,c=l.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},7209:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8656),o=i(1421);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var s=l.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&l.hasAttribute("type")?u=l.getAttribute("type").toLowerCase():("button"===s||n.AriaUtil.hasRoleInSemantics(l,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(l);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):l.hasAttribute("role")&&l.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",l.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},8262:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(482),s=i(8656),u=i(295),d=i(1421);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,c=l.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;if(r.CommonUtil.getAncestor(l,"table"))return null;if(n.AriaUtil.getAncestorWithRole(l,"combobox")&&!(n.AriaUtil.hasRoleInSemantics(l,"textbox")||n.AriaUtil.hasRoleInSemantics(l,"searchbox")||"input"===c||"select"===c&&n.AriaUtil.hasRoleInSemantics(l,"combobox")))return null;for(var m=["listbox","tree","grid","dialog"],p=0;p<m.length;p++)if(n.AriaUtil.hasRoleInSemantics(l,m[p]))for(var h=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"combobox",!0,!0),_=0;_<h.length;_++){var b=h[_],g=r.CommonUtil.getElementAttribute(b,"aria-owns");if(g)for(var f=r.CommonUtil.normalizeSpacing(g.trim()).split(" "),v=0;v<f.length;v++)if(o.FragmentUtil.getById(l,f[v])===l)return null}var A=d.AccNameUtil.computeAccessibleName(l);if(("input"===c||"button"===c)&&A&&A.name&&A.name.trim().length>0&&("label"===A.nameFrom||"internal"===A.nameFrom||"alt"===A.nameFrom))return(0,a.RulePass)("pass");var y=n.AriaUtil.getResolvedRole(l);if(y&&"button"===y&&"input"!==c&&"button"!==c&&!r.CommonUtil.getAncestor(l,"form"))return null;if(A&&A.name&&A.name.trim().length>0&&("text"===A.nameFrom||"title"===A.nameFrom))return(0,a.RulePass)("pass");var w=n.AriaUtil.getAllDescendantsWithRoles(l,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(w&&w.length>0)for(var k=0;k<w.length;k++)if(r.CommonUtil.attributeNonEmpty(w[k],"title")||r.CommonUtil.attributeNonEmpty(w[k],"alt"))return(0,a.RulePass)("pass");if(r.CommonUtil.attributeNonEmpty(l,"aria-labelledby")){var C=l.getAttribute("aria-labelledby").split(/\s+/);for(p=0;p<C.length;++p){var x=o.FragmentUtil.getById(l,C[p]);if(x&&!u.DOMUtil.sameNode(x,l)&&s.VisUtil.isNodeVisible(x)&&r.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&A&&A.name&&A.name.trim().length>0&&("label"===A.nameFrom||"content"===A.nameFrom))return(0,a.RulePass)("pass");var P=l.getAttribute("id");return P&&P.trim().length>0&&l.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:r.CommonUtil.attributeNonEmpty(l,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},7017:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(4377),l=i(4377);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")){var n=l.getAttribute("type").toLowerCase();if("hidden"===n||"submit"===n||"image"===n||"button"===n||"reset"===n)return null}return(0,a.RulePotential)("potential_warning")}}},9980:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(4377);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var l=e.dom.node;if(l.hasAttribute("type")){var n=l.getAttribute("type").toLowerCase();if("hidden"==n||"button"==n)return(0,a.RulePass)("Pass_0")}if(l.hasAttribute("hidden")){var r=l.getAttribute("hidden");if(""==r||"hidden"==r.toLowerCase())return(0,a.RulePass)("Pass_0")}if(l.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(l.hasAttribute("aria-labelledby")&&l.hasAttribute("id")){var o=l.getAttribute("id").trim();return l.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},7733:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(482),o=i(295);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.CommonUtil.hasInnerContentHidden(l))return(0,a.RulePass)("Pass_Regular");if((l.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(l.hasAttribute("aria-labelledby")){var s=r.FragmentUtil.getById(l,l.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,l)&&n.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},1256:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(482),s=i(8656),u=i(1775),d=i(7440);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;if(u.CSSUtil.isMaterialIconFont(l))return(0,a.RulePass)("Pass_0");var c=!0,m=l.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&l.hasAttribute("type")&&(h=l.getAttribute("type").toLowerCase(),-1!==r.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var _=n.AriaUtil.getAriaAttribute(l,"aria-labelledby");if(!_||r.CommonUtil.isIdReferToSelf(l,_)||p){var b=null;if(_&&!r.CommonUtil.isIdReferToSelf(l,_))for(var g=_.split(/\s+/),f=0;f<g.length;++f){var v=o.FragmentUtil.getById(l,g[f]);if(v){b=r.CommonUtil.getInnerText(v);break}}else b=n.AriaUtil.getAriaAttribute(l,"aria-label");if(!b)return null;var A=null;if(p&&(l.hasAttribute("value")?A=l.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var y=r.CommonUtil.getLabelForElementHidden(l,!0);if(!y){var w=d.DOMWalker.parentNode(l);if("label"===w.nodeName.toLowerCase()){var k=w.cloneNode(!0);y=r.CommonUtil.removeAllFormElementsFromLabel(k)}}var C=y||l;A=y||-1===["meter","output","progress","select","textarea"].indexOf(m)?r.CommonUtil.getOnScreenInnerText(C):""}var x=/[^a-zA-Z0-9]/g;A=A.replace(x," ");var P=r.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(x," ");var R=r.CommonUtil.normalizeSpacing(b).toLowerCase();if(P.length>1){var T=R.indexOf(P);if(T>=0&&R.length>P.length){var U=/^[0-9a-zA-Z]+$/;T+P.length<R.length&&R.charAt(T+P.length).match(U)&&(c=!1),c&&T>0&&R.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},9532:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(4377),l=i(4377),n=i(482),r=i(8656);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.getAttribute("for"),s=!1,u=n.FragmentUtil.getById(l,o);if(u){if(!r.VisUtil.isNodeVisible(u)&&!r.VisUtil.isNodeVisible(l))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!r.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},6698:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(7440);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.DOMWalker.parentElement(l);if(!n.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=l.children,d=0;s&&d<u.length;d++)s=n.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},9632:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7440),s=i(8656);t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,u=l.nodeName.toLowerCase();if(r.CommonUtil.isNodeDisabled(l)||s.VisUtil.hiddenByDefaultElements.includes(u))return null;if(null===r.CommonUtil.getAncestor(l,["body"]))return null;if(null!==r.CommonUtil.getAncestor(l,["script","label"]))return null;var d=n.AriaUtil.getRolesWithTypes(l,["widget"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","columnheader","rowheader"],d),null!==n.AriaUtil.getAncestorWithRoles(l,d))return null;for(var c=!0,m=l.firstChild;c&&m;){if("#text"==m.nodeName){var p=m.nodeValue;if(!(c=!/^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(p)))for(var h=new o.DOMWalker(m);!c&&h.prevNode();){var _=h.node.nodeName.toLowerCase();if(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre"].includes(_))break;if("#text"==_){var b=h.node.nodeValue;c=b.length>0&&![" ","\t","\n"].includes(b.charAt(b.length-1))}}}m=m.nextSibling}return c?null:c?void 0:(0,a.RulePotential)("potential_list")}}},3692:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;l=!0;var m=!1;if(o.children&&0!=o.children.length){for(;l&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(n.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}l="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}l=l&&"dt"==u&&"dd"==d||l&&m}else l=!0}else if("li"==s)l=null!=r.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)l=null!=r.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,l=!0;l&&null!=c;)n.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(l=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);l=l&&h||l&&m}else l=!0;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},5430:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(4377),l=i(4377);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},1018:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(4377),l=i(4377),n=i(8656);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.getAttribute("alt").trim().length<=150;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3433:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o="";null==(o="area"==l.nodeName.toLowerCase()?l.getAttribute("href"):l.getAttribute("src"))&&(o="");var s=n.CommonUtil.getFileExt(o),u=0!=s.length&&(n.CommonUtil.isAudioExt(s)||n.CommonUtil.isVideoExt(s)),d=l.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},8012:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,o=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(o)||(l="bgsound"!=o.nodeName.toLowerCase()&&!n.CommonUtil.isAudioObjEmbedLink(o))?null:l?void 0:(0,a.RuleManual)("Manual_1")}}},3881:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(4377),l=i(4377);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l,n=e.dom.node,r=n.nodeName.toLowerCase();if("bgsound"==r)l=!1;else if("param"==r){var o="";n.hasAttribute("value")&&(o=n.getAttribute("value").toLowerCase()),l=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==r){var s;l=!0,n.hasAttribute("flashvars")&&(l=-1==(s=n.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),l&&n.hasAttribute("src")&&(l=-1==(s=n.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(l&&n.hasAttribute("autostart")){var u=n.getAttribute("autostart").toLowerCase();l="true"!=u&&"1"!=u}return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},3106:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(4377),l=i(4377),n=i(8656);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=!0,o=l.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(r=!1),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},1276:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(4377),l=i(4377),n=i(8137);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!n.CommonUtil.isVideoObjEmbedLink(l);return r?null:r?void 0:(0,a.RuleManual)("Manual_1")}}},5424:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o;return(o="applet"!=l.nodeName.toLowerCase()&&!n.CommonUtil.isVideoObjEmbedLink(l))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},4248:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(482),l=i(8137),n=i(4377),r=i(4377);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[{bc659a:{pass:"pass",fail:"fail",fail_longrefresh:"pass"}}],run:function(e,t,i){var r=e.dom.node;if("refresh"!==r.getAttribute("http-equiv").toLowerCase())return null;var o=r.getAttribute("content").toLowerCase();if(!o.match(/^\d+$/)&&!o.match(/^\d+;/))return null;if(l.CommonUtil.triggerOnce(a.FragmentUtil.getOwnerFragment(r),"meta_redirect_optional",!1))return null;var s=o.match(/^(\d+); +[^ ]/);return s&&0!==parseInt(s[1])?parseInt(s[1])<72001?(0,n.RuleFail)("fail"):(0,n.RuleFail)("fail_longrefresh"):(0,n.RulePass)("pass")}}},9526:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(4377),l=i(4377);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"meta_refresh_delay.html",Pass_0:"meta_refresh_delay.html",Potential_1:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",Pass_0:"Rule Passed",Potential_1:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:["bisz58","bc659a"],run:function(e,t,i){var l=e.dom.node;if("refresh"!==l.getAttribute("http-equiv").toLowerCase())return null;var n=l.getAttribute("content").toLowerCase();return n.match(/^\d+$/)||n.match(/^\d+;/)?n.match(/^\d+; +[^ ]/)?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1"):null}}},9379:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(4377),l=i(4377);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{Pass_0:"pass",Potential_1:"fail"}}],run:function(e,t,i){var l=e.dom.node;if("viewport"!==l.getAttribute("name").toLowerCase())return null;var n=l.getAttribute("content").toLowerCase();if(!n||""===n.trim()||!n.includes("maximum-scale")&&!n.includes("user-scalable"))return null;for(var r=null,o=null,s="yes",u="2.0",d=0,c=n.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(r=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var _;return h=Number(u),_=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[r]):_<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},5495:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=n.CommonUtil.hasInnerContentHidden(l);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7753:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(4377),l=i(4377),n=i(8656),r=i(1421);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(l.hasAttribute("type")&&-1!==l.getAttribute("type").indexOf("text"))return null;if(l.getAttribute("role"))return null;var o=l.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=r.AccNameUtil.computeAccessibleName(l);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},1252:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(9193);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(r.AncestorUtil.isFrame(i))return null;for(var l=e.dom.node,o=l.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=l.querySelectorAll("title"),d=0;d<u.length;++d)if(!n.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&n.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},3576:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getInnerText(l).trim(),o=r.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[r]):0===r.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(r)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[r])}}},3617:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(4377),l=i(4377);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},6110:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.CommonUtil.getAncestor(l,"svg"))return(0,a.RulePass)("Pass_0");if(n.CommonUtil.attributeNonEmpty(l,"role"))return(0,a.RulePass)("Pass_0");var r=l.nodeName.toLowerCase(),o="a"==r||"area"==r||"input"==r;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5681:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(4377),l=i(4377),n=i(8137);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"role"),o=l.nodeName.toLowerCase();if(!(r=r||("a"==o||"area"==o)&&n.CommonUtil.attributeNonEmpty(l,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=l.getAttribute("onclick").toLowerCase();r=!0;for(var d=0;r&&d<s.length;++d)r=-1==u.indexOf(s[d])}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},1922:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(4377),l=i(4377);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!l.hasAttribute("onchange")&&!l.hasAttribute("onfocus");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},7906:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(4377),l=i(4377),n=i(8137);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getChildByTagHidden(l,"optgroup",!1,!0).length>0||n.CommonUtil.getChildByTagHidden(l,"option",!1,!0).length<=10;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5451:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(7788),o=i(8656);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&r.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",n.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(l=r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=n.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!l&&p<s.paramSkipText.value.length;++p)l=-1!=m.indexOf(s.paramSkipText.value[p]);else l=!1}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},6349:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(9193),o=i(7788),s=i(8656);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var l,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",n.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(l=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=n.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var _=m.getAttribute("href"),b=_.indexOf("#");-1!=b&&(h=_.substring(b+1))}if(null!=h)for(l=null!=d.getElementById(h),p=0;!l&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(l=!0)}return l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5393:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(4377),l=i(4377),n=i(8137);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase(),o=!0;if("link"===r&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&(o=n.CommonUtil.triggerOnce(l,"style_background_decorative",!1)),o&&"style"===r||l.hasAttribute("style")){var s=("style"===r?n.CommonUtil.getInnerText(l):l.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},9887:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(4377),l=i(4377),n=i(1775);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!0;if("style"===l.nodeName.toLowerCase()){for(var o=n.CSSUtil.getCSSStyle(l),s=0;r&&s<o.length;++s)o[s].selector&&(r=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(r)for(var u=0;u<l.ownerDocument.styleSheets.length;u++)if((g=l.ownerDocument.styleSheets[u]).ownerNode===l)try{var d=g.cssRules?g.cssRules:g.rules;if(d)for(var c=0;r&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;r&&h<v.length;h++)null!==(y=v[h]).selectorText&&void 0!==y.selectorText&&(-1===(k=y.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;r&&h<f.length;h++){var _=f[h];if(_.type&&4===_.type){if(v=_.cssRules)for(var b=0;b<v.length;b++)null!==(y=v[b]).selectorText&&void 0!==y.selectorText&&(-1===(k=y.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}else null!==_.selectorText&&void 0!==_.selectorText&&(-1===(k=_.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=_.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}}}catch(e){}}if("link"===l.nodeName.toLowerCase()&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&l.hasAttribute("href")&&0!==l.getAttribute("href").trim().length)for(u=0;u<l.ownerDocument.styleSheets.length;u++){var g;if((g=l.ownerDocument.styleSheets[u])&&g.ownerNode===l)try{var f;if(f=g.cssRules?g.cssRules:g.rules)for(h=0;r&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;r&&b<v.length;b++){var y;if(null!==(y=v[b]).selectorText&&void 0!==y.selectorText){var w=y.selectorText.toLowerCase();-1===w.indexOf(":before")&&-1===w.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var k,C;-1===(k=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=f[h].style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1)}}}catch(e){}}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5102:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(7440),o=i(7788);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(n).toLowerCase();for(var d=0;d<n.ownerDocument.styleSheets.length;d++)if((g=n.ownerDocument.styleSheets[d])&&g.ownerNode===n)try{for(var c=g.cssRules?g.cssRules:g.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var _=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<_.length;b++)u+=_[b].cssText}}catch(e){}}else if(n.hasAttribute("style"))u=n.getAttribute("style").toLowerCase();else if("link"===s&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(d=0;d<n.ownerDocument.styleSheets.length;d++){var g;if((g=n.ownerDocument.styleSheets[d])&&g.ownerNode===n)try{var f=g.cssRules?g.cssRules:g.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),y=u.replace(/-color/g,"").match(/\bcolor\b/i);if(n.hasAttribute("color")||y||A){var w={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in w||null!==a.CommonUtil.getAncestor(n,w))&&n.hasChildNodes())for(var k=new r.DOMWalker(n);!v&&k.nextNode()&&k.node!==n;)v=k.node.nodeName.toLowerCase()in w}return v||(v=o.CacheUtil.getCache(n.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(n.ownerDocument,"style_color_misuse",!0)),v?(0,l.RulePass)("Pass_0"):v?void 0:(0,l.RulePotential)("Potential_1")}}},9977:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(1775),o=i(8680);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||n.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=r.CSSUtil.getDefinedStyles(s),d=[];d.push(r.CSSUtil.getDefinedStyles(s,":focus")),d.push(r.CSSUtil.getDefinedStyles(s,":focus-visible")),d.push(r.CSSUtil.getDefinedStyles(s,":focus-within"));var c=d[0];if(Object.keys(c).length>0){if(!((u["outline-width"]||u["outline-style"])&&"0px"!==u["outline-width"]&&"none"!==u["outline-style"]||c["outline-style"]&&"none"===c["outline-style"]))return(0,l.RulePass)("pass_focus_visible");var m=!1,p=0;for(var h in c)if(n.checkParams.value.includes(h)){var _=c[h],b=u[h];if(h.includes("style")){if(m="none"===_,b&&"none"!==_&&_===b)return(0,l.RulePotential)("potential_focus_not_visible")}else if(h.includes("width")){if(p++,"initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px"),b&&("initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px")),_=r.CSSUtil.getPixelsFromStyle(_,s),b=r.CSSUtil.getPixelsFromStyle(b,s),0==_||_<=b)return(0,l.RulePotential)("potential_focus_not_visible")}else if(h.includes("color")){p++;var g=o.ColorUtil.ColorCombo(s);if(null===g)continue;var f=g.bg;if(!f)continue;if("initial"===_&&(_="black"),b&&"initial"===b&&(b="black"),_=o.ColorUtil.Color(_),b=o.ColorUtil.Color(b),null===_||null===b)continue;var v=_.contrastRatio(f),A=b.contrastRatio(f);if(v<3||v<=A)return(0,l.RulePotential)("potential_focus_not_visible")}else if(p++,null!=b&&_===b)return(0,l.RulePotential)("potential_focus_not_visible")}if(m&&0===p)return(0,l.RulePotential)("potential_focus_not_visible")}else for(var y in u)if(n.checkParams.value.includes(y)&&"none"!==(b=u[y]))return(0,l.RulePotential)("potential_focus_not_visible");return(0,l.RulePass)("pass_focus_visible")}}},8454:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(4377),l=i(4377),n=i(7788);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase();if("link"===r&&(!l.hasAttribute("rel")||"stylesheet"!==l.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==r&&"link"!==r&&l.hasAttribute("style")&&0===l.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=n.CacheUtil.getCache(l.ownerDocument,"style_highcontrast_visible",!1);return n.CacheUtil.setCache(l.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},25:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(4377),l=i(4377),n=i(8137);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=!1,r=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){n.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,_=!1,b="",g=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var y=A.substring(A.indexOf("+")+1);if(y=y.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=y.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){_=!0;var w=A.substring(A.indexOf("~")+1);b=(w=w.trim()).split(" ")[0]}if(!h&&!_)return(0,a.RulePass)("Pass_0");if(b&&(I=y.indexOf("display:"))&&"none;"!==y.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var k=d.cssRules?d.cssRules:d.rules,C=0;C<k.length;C++){var x=c[C].cssText,P=b+" {",R=x.trim(),T=R.indexOf(P);if(R.slice(T).trim(),R.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=x.split(":")[0];if((U=U.split(" ")[0])===b&&x.match(/:hover/g)){var I;if(g=!0,I=x.indexOf("display:"))if(f=!0,"none;"!==y.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var L=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===L[0].nextElementSibling.tagName){l=!0;continue}}else if(h){if(!r){r=!0;break}continue}if(""!==p&&_){L=s.ownerDocument.getElementsByTagName(p.toUpperCase());var E=[],W=L[0].nextElementSibling;do{if(W.tagName!==b.toUpperCase())break;E.push(W)}while(W=W.nextElementSibling);var q=E.length;if(1===q)return(0,a.RulePass)("Pass_2");if(q>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(C===k.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(C===k.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(C===k.length-1&&!1===g)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===g)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return l?(0,a.RulePass)("Pass_0"):r?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},2884:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(4377),l=i(4377);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!0,r=/\d+(vw|vh|vmin|vmax)/gi,o=l.nodeName.toLowerCase();if("style"===o){for(var s=0;s<l.ownerDocument.styleSheets.length;s++)if((g=l.ownerDocument.styleSheets[s]).ownerNode===l)try{var u=g.cssRules?g.cssRules:g.rules;if(u)for(var d=0;n&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(r);v.length&&p&&(n=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var _=0;n&&_<f.length;_++){var b=f[_];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(r),v.length&&p&&(n=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<l.ownerDocument.styleSheets.length;s++){var g;if((g=l.ownerDocument.styleSheets[s])&&g.ownerNode===l)try{var f;if(f=g.cssRules?g.cssRules:g.rules)for(_=0;n&&_<f.length;_++){var v,A=f[_];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(r),v.length&&p&&(n=!1)}}catch(e){}}else{var y=l.getAttribute("style");y&&(p=y.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(n=!1)}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},5390:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(4377),l=i(4377),n=i(1421),r=i(8656);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l)||r.VisUtil.isNodePresentational(l))return null;var o=n.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},7196:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(4377),l=i(4377),n=i(8137);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){e.dom.node;var l=n.CommonUtil.isTableDescendant(i);if(null!==l&&0!==l.length)return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),l[0].role])}}},9965:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(4377),l=i(4377),n=i(8137);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.CommonUtil.hasInnerContentHidden(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4468:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(4377),l=i(4377),n=i(8137);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return null!=n.CommonUtil.getAncestor(l,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4451:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(4377),l=i(4377),n=i(5755);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.rows;if(!n.TableUtil.isDataTable(l)||null===r||0===r.length)return null;var o=n.TableUtil.tableHeaderExists(l);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},6087:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(295),s=i(8656),u=i(4944);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var l=e.dom.node,d=r.CommonUtil.getAncestor(l,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;l.nodeName.toLowerCase();var m=l.ownerDocument,p=l.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),_=[],b=[],g=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var y=m.getElementById(A);if(y)if(o.DOMUtil.sameNode(y,l))b.push(A);else if(o.DOMUtil.isInSameTable(y,l)){if("th"!==y.nodeName.toLowerCase()){var w=n.AriaUtil.getRoles(y,!0);w.includes("columnheader")||w.includes("rowheader")||f.push(A)}}else g.push(A);else _.push(A)}}var k=[];return 0!=_.length&&k.push((0,a.RuleFail)("Fail_1",[_.toString()])),0!=b.length&&k.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=g.length&&k.push((0,a.RuleFail)("Fail_3",[g.toString()])),0!=f.length&&k.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==k.length?(0,a.RulePass)("Pass_0"):k}}},5864:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(7788),o=i(5755);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,s=n.CommonUtil.getAncestor(l,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===r.CacheUtil.getCache(l,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];r.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var _=parseInt(p.getAttribute("rowspan"));_||(_=1);for(var b=0;u[d][b];)b+=1;for(var g=0;g<_;++g){u[d+g]||(u[d+g]=[]);for(var f=0;f<h;++f)u[d+g][b+f]=p}}}var v=l.ownerDocument,A={},y={};for(d=0;d<u.length;++d){var w=!1;for(m=0;m<u[d].length;++m){var k=u[d][m],C=k.nodeName.toLowerCase();if("th"==C){if("row"==k.getAttribute("scope")?(w=!0,n.CommonUtil.attributeNonEmpty(k,"axis")||(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0)):"col"==k.getAttribute("scope")&&(y[m]=!0,n.CommonUtil.attributeNonEmpty(k,"axis")||(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0)),n.CommonUtil.attributeNonEmpty(k,"headers")){var x=k.getAttribute("headers").split(" ");for(g=0;g<x.length;++g)(P=v.getElementById(x[g].trim()))&&n.CommonUtil.getAncestor(P,"table")==s&&(A[r.CacheUtil.getCache(P,"table_headers_related",null)]=!0)}}else if("td"==C)if(w||y[m])A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0;else if(n.CommonUtil.attributeNonEmpty(k,"headers"))for(x=k.getAttribute("headers").split(" "),g=0;g<x.length;++g){var P;(P=v.getElementById(x[g].trim()))&&n.CommonUtil.getAncestor(P,"table")==s&&(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0,A[r.CacheUtil.getCache(P,"table_headers_related",null)]=!0)}}}r.CacheUtil.setCache(s,"table_headers_related",A)}var R=r.CacheUtil.getCache(l,"table_headers_related",null),T=r.CacheUtil.getCache(s,"table_headers_related",null),U=R&&T&&R in T;return U||"0:0"!==R||0!=n.CommonUtil.getInnerText(l).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===r.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:r.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},4066:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(4377),l=i(4377),n=i(8656),r=i(5755);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var o=!r.TableUtil.isLayoutTable(l);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},2841:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(4377),l=i(4377);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if("td"===l.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var n=l.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},272:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656),s=i(5755);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(l))return null;if(s.TableUtil.isDataTable(l))return null;if(n.AriaUtil.isNodeInGrid(l))return null;var u=[];r.CommonUtil.attributeNonEmpty(l,"summary")&&u.push(l);for(var d=l.getElementsByTagName("caption"),c=0;c<d.length;++c)if(r.CommonUtil.getAncestor(d[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=l.getElementsByTagName("th");for(c=0;c<m.length;++c)if(r.CommonUtil.getAncestor(m[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=l.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&r.CommonUtil.getAncestor(p[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=l.nodeName.toLowerCase(),_=new Array,b={};for(c=0;c<u.length;c++){var g=u[c].nodeName.toLowerCase();b.hasOwnProperty(g)||("table"!=g||b.hasOwnProperty.summary?(b[g]=!0,_.push(g)):(b.summary=!0,_.push("summary")))}var f=_.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},1348:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(482),o=i(295);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,s=e.dom.node;if(s.hasAttribute("summary"))l=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=r.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+n.CommonUtil.getInnerText(p).trim().toLowerCase())}}l=d}if(!l)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(l.length>0){var _=n.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return l.includes(_)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},6215:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(5697),o=i(1775);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLocaleLowerCase(),u=new r.DOMMapper,d=u.getUnadjustedBounds(n);if(!d)return null;if(!a.CommonUtil.isTarget(n))return null;if(d.height>=24&&d.width>=24)return(0,l.RulePass)("pass_sized");var c=o.CSSUtil.getInlineStatus(n);if(null===c)return null;if(c.inline)return c.text?null===c.violation?(0,l.RulePass)("pass_inline"):(0,l.RulePotential)("recommendation_inline",[s,c.violation]):null===c.violation?(0,l.RulePass)("pass_default"):(0,l.RulePotential)("recommendation_inline",[s,c.violation]);if(o.CSSUtil.isTargetBrowserDefault(n))return(0,l.RulePass)("pass_default");var m=n.ownerDocument;if(!m)return null;var p=getComputedStyle(n);if(null===p)return null;var h=p.zIndex;h&&!isNaN(Number(h))||(h="0");var _=m.querySelectorAll("body *:not(script):not(style)");if(_&&0!==_.length){for(var b,g=!0,f=24,v=24,A=null,y=null,w=[],k=function(e){var t=_[e];if(n.contains(t))return g=!1,"continue";if(t.contains(n)||!a.CommonUtil.isTarget(t)||w.some((function(e){return e.contains(t)})))return"continue";var i=u.getUnadjustedBounds(t);if(!i)return"continue";var r="0";if((b=getComputedStyle(t))&&((r=b.zIndex)&&!isNaN(Number(r))||(r="0")),i.top<=d.top&&i.left<=d.left&&i.top+i.height>=d.top+d.height&&i.left+i.width>=d.left+d.width)return(g?parseInt(h)<parseInt(r):parseInt(h)<=parseInt(r))?{value:null}:{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])};if(d.top<=i.top&&d.left<=i.left&&d.top+d.height>=i.top+i.height&&d.left+d.width>=i.left+i.width)return(g?parseInt(h)<parseInt(r):parseInt(h)<=parseInt(r))?{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])}:{value:(0,l.RuleFail)("violation_spacing",[s,t.nodeName.toLowerCase()])};if((d.top>=i.top&&d.top<=i.top+i.height||d.top+d.height<=i.top&&d.top+d.height>=i.top+i.height)&&(d.left>i.left&&d.left<i.left+i.width||i.left>d.left&&i.left<d.left+d.width)||(d.top>i.top&&d.top<i.top+i.height||i.top>d.top&&i.top<d.top+d.height)&&(d.left>=i.left&&d.left<=i.left+i.width||d.left+d.width>=i.left&&d.left+d.width<=i.left+i.width))return{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])};var o=24,c=24;d.width<24&&(d.top>=i.top&&d.top<=i.top+i.height||d.top<=i.top&&d.top+d.height>i.top)&&(o=Math.min(Math.abs(d.left-i.left),Math.abs(d.left-(i.left+i.width)),Math.abs(d.left+d.width-(i.left+i.width)),Math.abs(d.left+d.width-i.left))),d.height<24&&(d.left>=i.left&&d.left<=i.left+i.width||d.left<=i.left&&d.left+d.width>i.left)&&(c=Math.min(Math.abs(d.top-i.top),Math.abs(d.top-(i.top+i.height)),Math.abs(d.top+d.height-(i.top+i.height)),Math.abs(d.top+d.height-i.top))),o<f&&(f=o,A=t),c<v&&(v=c,y=t),w.push(t)},C=0;C<_.length;C++){var x=k(C);if("object"==typeof x)return x.value}return Math.round(d.width/2)+f<12||Math.round(d.height/2)+v<12?Math.round(d.width/2)+f<Math.round(d.height/2)+v?(0,l.RuleFail)("violation_spacing",[s,A.nodeName.toLowerCase()]):(0,l.RuleFail)("violation_spacing",[s,y.nodeName.toLowerCase()]):(0,l.RulePass)("pass_spacing")}}}},5275:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7440),s=i(1775),u=i(8656);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.isNodeDisabled(l)||!u.VisUtil.isNodeVisible(l))return null;if(null===r.CommonUtil.getAncestor(l,["body"])||null!==r.CommonUtil.getAncestor(l,["script"]))return null;var d=0,c=l.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],_=new o.DOMWalker(l);_.nextNode();for(var b=!1;!b&&_.nextNode()&&_.node!==l&&_.node!==o.DOMWalker.parentNode(l)&&!["br","div","p"].includes(_.node.nodeName.toLowerCase());)if(_.node!==l&&!r.CommonUtil.shouldNodeBeSkippedHidden(_.node)){var g=_.node.nodeName.toLowerCase();if(3===_.node.nodeType){if(_.node.nodeValue.trim().length>0&&_.node.parentElement){var f=getComputedStyle(_.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],_.node.parentElement)>d)){var v=_.node.nodeValue.trim();(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,_.bEndTag=!0}else b=!0}}else if(1===_.node.nodeType)if("b"===g||"strong"===g||"u"===g||"font"===g){var A;v=r.CommonUtil.getInnerText(_.node),(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,_.bEndTag=!0}else{var y=n.AriaUtil.getResolvedRole(_.node);b=null!==y&&"generic"!==y&&"paragraph"!==y&&"strong"!==y||"applet"===g}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},7900:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(8137),l=i(8656),n=i(8680),r=i(4377),o=i(4377),s=i(1775);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!l.VisUtil.isNodeVisible(o)||null!=l.VisUtil.hiddenByDefaultElements&&null!=l.VisUtil.hiddenByDefaultElements&&l.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var _=c.getComputedStyle(p);if(!1==("0"!==_.width&&"0"!==_.height&&"0"!==_.opacity&&"none"!==_.display&&"hidden"!==_.visibility&&"hidden"!==_.overflow&&("auto"===_.left||"absolute"===_.position&&parseInt(_.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===_.left||"absolute"===_.position&&parseInt(_.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==_.clip){var g=_.clip.toString();if(g.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(g)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===_.position&&b<7&&-1!==b)return null;var y=n.ColorUtil.ColorCombo(p);if(null!==y){var w=y.fg,k=y.bg,C=w.contrastRatio(k),x=s.CSSUtil.getWeightNumber(_.fontWeight),P=s.CSSUtil.getFontInPixels(_.fontSize,p),R=P>=24||P>=18.6&&x>=700;s.CSSUtil.containsCKJ(m)&&(R=P>=29.3||P>=24&&x>=700);var T=C>=4.5||C>=3&&R,U=y.hasBGImage||y.hasGradient,I=y.textShadow,L=a.CommonUtil.isNodeDisabled(p);if(!L){var E=a.CommonUtil.getControlOfLabel(p);E&&(L=a.CommonUtil.isNodeDisabled(E))}return!L&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(L=!0),!L&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(L=!0),!T&&L&&(T=!0),T?(0,r.RulePass)("pass",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient]):U?(0,r.RulePotential)("potential_graphic_background",[C.toFixed(2),P,x]):I?(0,r.RulePotential)("potential_text_shadow",[C.toFixed(2),P,x]):w.toHex()===k.toHex()?(0,r.RulePotential)("potential_same_color",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient]):(0,r.RuleFail)("fail_contrast",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},5027:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;if(null===n.CommonUtil.getAncestor(l,["body"]))return null;for(var o=!0,s=l.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===n.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=n.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=n.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},3496:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788),s=i(8656);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,c=l.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===r.CommonUtil.getAncestor(l,["body"]))return null;if(null!==r.CommonUtil.getAncestor(l,["script","a","label"]))return null;var m=n.AriaUtil.getResolvedRole(l);if(m){var p=n.AriaUtil.getRolesWithTypes(l,["landmark"]);if(p&&p.includes(m))return null}var h=n.AriaUtil.getRolesWithTypes(l,["widget","heading"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==n.AriaUtil.getAncestorWithRoles(l,h))return null;for(var _="",b="",g=l.firstChild,f="";g;){if("#text"===g.nodeName){var v=g.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}g=g.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,l="(ss+|"+a[0],n=1;n<a.length;++n){var r=a[n].trim().split(" ");if(l+="|"+r[0],r.length>1)for(var s=1;s<r.length;++s)l+=" +"+r[s]}l+=")",i=new RegExp(l,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(l.ownerDocument,"exemptText");f=f.replace(A," "),_=d(l.ownerDocument,"positionText",f),b=d(l.ownerDocument,"otherText",f)}var y=[];return _&&y.push((0,a.RulePotential)("potential_position",[_])),b&&y.push((0,a.RulePotential)("potential_other",[b])),0==y.length?null:y}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,l={},n=[];return i.split(/\s+/).reduce((function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),r=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=r.indexOf(a[o]),u=a[o].length,d=r.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=r.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}r.length!=u&&1!=c&&1!=m||(l.hasOwnProperty(i)||(l[i]=!0,n.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e}),Object.create(null)),n.join(", ")}},1131:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656),o=i(1775),s=i(5697);t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){var l=e.dom.node;if(l.nodeName.toLowerCase(),r.VisUtil.isNodeHiddenFromAT(l)||n.CommonUtil.isNodeDisabled(l))return null;var u=(new s.DOMMapper).getUnadjustedBounds(l);if(!u)return null;if(u.top<0||u.left<0)return null;if(n.CommonUtil.getAncestor(l,"svg"))return null;for(var d="",c=l.childNodes,m=0;m<c.length;++m)3==c[m].nodeType&&(d+=c[m].nodeValue);if(0==d.trim().length)return null;var p=getComputedStyle(l).getPropertyValue("font-size"),h=parseFloat(p),_=o.CSSUtil.getDefinedStyles(l);if(0===Object.keys(_).length)return null;var b=[],g=/(-?[\d.]+)([a-z%]*)/,f=_["word-spacing"];if(f)if((f.startsWith("inherit")||f.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"word-spacing":["*"]},["inherit","unset"]))?f=o.CSSUtil.getDefinedStyles(w)["word-spacing"]:f.startsWith("unset")&&(f="initial")),"important"===l.style.getPropertyPriority("word-spacing"))if("initial"===(f=f.substring(0,f.length-10-1))||"normal"===f)b.push((0,a.RuleFail)("fail_word_spacing_style"));else{var v=parseFloat(f);isNaN(v)?b.push((0,a.RulePass)("pass")):""!==(C=f.trim().match(g))[2]&&0!==C[1]&&(null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<.16?b.push((0,a.RuleFail)("fail_word_spacing_style")):b.push((0,a.RulePass)("pass")))}else b.push((0,a.RulePass)("pass"));var A=_["letter-spacing"];if(A)if((A.startsWith("inherit")||A.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"letter-spacing":["*"]},["inherit","unset"]))?A=o.CSSUtil.getDefinedStyles(w)["letter-spacing"]:A.startsWith("unset")&&(A="initial")),"important"===l.style.getPropertyPriority("letter-spacing"))if("initial"===(A=A.substring(0,A.length-10-1))||"normal"===A)b.push((0,a.RuleFail)("fail_letter_spacing_style"));else{var y=parseFloat(A);isNaN(y)?b.push((0,a.RulePass)("pass")):""!==(C=A.trim().match(g))[2]&&0!==C[1]&&(null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<.12?b.push((0,a.RuleFail)("fail_letter_spacing_style")):b.push((0,a.RulePass)("pass")))}else b.push((0,a.RulePass)("pass"));var w,k=_["line-height"];if(k&&null===o.CSSUtil.getAncestorWithStyles(l,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]}))if((k.startsWith("inherit")||k.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"line-height":["*"]},["inherit","unset"]))?k=o.CSSUtil.getDefinedStyles(w)["line-height"]:k.startsWith("unset")&&(k="initial")),"important"===l.style.getPropertyPriority("line-height"))if("initial"===(k=k.substring(0,k.length-10-1))||"normal"===k)b.push((0,a.RuleFail)("fail_line_height_style"));else{var C,x,P=parseFloat(k);isNaN(P)?b.push((0,a.RulePass)("pass")):""===(C=k.trim().match(g))[2]?C[1]<1.5?b.push((0,a.RuleFail)("fail_line_height_style")):b.push((0,a.RulePass)("pass")):null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<1.5?b.push((0,a.RuleFail)("fail_line_height_style")):b.push((0,a.RulePass)("pass"))}else b.push((0,a.RulePass)("pass"));return b.length>0?b:null}}},8681:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getAncestor(l,["body","script","code"]);if(null==r||"body"!=r.nodeName.toLowerCase())return null;for(var o=!0,s=l.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},4577:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(4944),s=i(7440),u=i(8656);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&!n.AriaUtil.shouldBePresentationalChild(l)){if("datalist"===l.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=n.AriaUtil.getAncestorWithRole(l,m,!0))return null}var p=o.ARIAMapper.nodeToRole(l),h=0;if(r.CommonUtil.isTabbable(l)&&++h,h<1&&!n.AriaUtil.containsPresentationalChildrenOnly(l)&&l.firstChild)for(var _=new s.DOMWalker(l);h<1&&_.nextNode()&&_.node!=l;)1==_.node.nodeType&&!_.bEndTag&&r.CommonUtil.isTabbable(_.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},8051:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(490),o=i(8137),s=i(4944),u=i(7788),d=i(8656);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(l)&&!o.CommonUtil.isNodeDisabled(l)&&!r.AriaUtil.shouldBePresentationalChild(l)){var c=s.ARIAMapper.nodeToRole(l),m=0;o.CommonUtil.isTabbable(l)&&++m;var p=[];if(m<2&&!r.AriaUtil.containsPresentationalChildrenOnly(l)&&l.firstChild)for(var h=new n.DOMWalker(l);m<2&&h.nextNode()&&h.node!=l;)if(1==h.node.nodeType&&!h.bEndTag&&o.CommonUtil.isTabbable(h.node)){if("input"===h.node.nodeName.toLowerCase()&&"radio"===h.node.getAttribute("type")){var _=h.node.getAttribute("name");if(p.includes(_))continue;p.push(_)}++m}var b=m<2;return b||u.CacheUtil.setCache(l,"widget_tabbable_single","potential_multiple_tabbable"),b?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},1070:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var a=i(4976),l=i(3005),n=[];for(var r in a)n.push(a[r]);var o={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:l.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:n.filter((function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))}]},1421:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(8235),l=i(8137),n=i(490),r=i(8656),o=i(7788),s=i(7440),u=i(295),d=function(){function e(){}return e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),r=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==r)return r;var s=n.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:l.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:l.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(r=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;var u=n.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(r=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=l.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||l.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=l.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,n=t.nodeName.toLowerCase();if(l.CommonUtil.form_labelable_elements.includes(n)&&(m=l.CommonUtil.getFormFieldLabel(t))&&""!==m.trim())return{name:l.CommonUtil.truncateText(m),nameFrom:"label"};if("input"===n&&t.hasAttribute("type"))if(l.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=l.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:l.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(_=l.CommonUtil.getElementAttribute(t,"alt"))&&""!==_.trim())return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"};if("button"===n){if((f=t.innerText)&&""!==f.trim())return{name:l.CommonUtil.truncateText(f),nameFrom:"text"};var d=t.querySelector("img");if(d&&!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===n&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(f=i.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"legend"};if("output"===n&&t.hasAttribute("for")){var c=t.getAttribute("for").trim().split(" ");if(c&&c.length>0){for(var m="",p=0;p<c.length;p++){var h=t.ownerDocument.getElementById(c[p]);!h||u.DOMUtil.sameNode(h,t)||r.VisUtil.isNodeHiddenFromAT(h)||r.VisUtil.isNodePresentational(h)||(a=e.computeAccessibleName(h))&&a.name&&a.name.trim().length>0&&(m+=" "+l.CommonUtil.normalizeSpacing(a.name))}if(m.trim().length>0)return{name:l.CommonUtil.truncateText(m),nameFrom:"label"}}}if("summary"===n&&(f=t.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"legend"};if("details"===n)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:l.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===n&&!(b=t.firstElementChild)&&(b=t.lastElementChild)&&"figcaption"===b.nodeName.toLowerCase()&&(f=b.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"figcaption"};if("img"===n&&t.hasAttribute("alt")){var _=t.getAttribute("alt");return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"}}if("area"===n&&t.hasAttribute("alt")&&(_=t.getAttribute("alt"))&&_.trim().length>0)return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"};if("table"===n){var b,g=t.firstElementChild;if(g&&"caption"===g.nodeName.toLowerCase()&&(b=g.innerText)&&b.trim().length>0)return{name:l.CommonUtil.truncateText(b),nameFrom:"caption"}}if("a"===n){var f;if((f=t.innerText)&&""!==f.trim())return{name:l.CommonUtil.truncateText(f),nameFrom:"text"};var v=t.querySelectorAll(":scope > img, :scope > svg");if(v&&v.length>0){var A="";if(v.forEach((function(t){if(!r.VisUtil.isNodeHiddenFromAT(t)&&!r.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(A+=" "+i.name.trim())}})),""!==A.trim())return{name:A.trim(),nameFrom:"alt"}}}return("optgroup"===n||"option"===n||"track"===n)&&(m=t.getAttribute("label"))&&m.trim().length>0?{name:l.CommonUtil.truncateText(m),nameFrom:"label"}:"svg"===n&&(a=e.computeAccessibleNameForSVGElement(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach((function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}})),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!r.VisUtil.isNodeHiddenFromAT(a)&&!r.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:l.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach((function(e){if("svg"!==e.nodeName.toLowerCase()&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&t.trim().length>0&&(s+=t)}})),""!==s.trim())return{name:l.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=n.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:l.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach((function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}})),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(n.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlostElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:l.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach((function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())})),i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlostElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,n=t.assignedNodes();a<n.length;a++){var r,o=n[a];(r=e.computeAccessibleName(o))&&r.name&&r.name.length>0&&(i+=" "+r.name.trim())}else(r=e.computeAccessibleName(t))&&r.name&&r.name.trim().length>0&&(i+=" "+r.name.trim());return i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;){var n=a.node;if(3===n.nodeType){var o=n.parentElement;!r.VisUtil.isNodeHiddenFromAT(o)&&!r.VisUtil.isNodePresentational(o)&&n.nodeValue&&n.nodeValue.trim().length>0&&(i+=" "+n.nodeValue.trim())}else if(1===n.nodeType&&!r.VisUtil.isNodeHiddenFromAT(n)&&!r.VisUtil.isNodePresentational(n)){var u=e.computeAccessibleName(n);u&&u.name&&u.name.length>0&&(i+=" "+u.name.trim())}}return i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"content"}:null},e}();t.AccNameUtil=d},490:function(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,l=0,n=t.length;l<n;l++)!a&&l in t||(a||(a=Array.prototype.slice.call(t,0,l)),a[l]=t[l]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var l=i(7788),n=i(8235),r=i(4944),o=i(7440),s=i(8656),u=i(8137),d=i(482),c=i(295),m=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase();"aria-"===l.substring(0,5)&&t.push(l)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase();"aria-"===l.substring(0,5)||t.push(l)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase(),n=e.getAttribute(l);""===n&&(n=null),"aria-"===l.substring(0,5)&&t.push({name:l,value:n})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase(),n=e.getAttribute(l);""===n&&(n=null),"aria-"===l.substring(0,5)||t.push({name:l,value:n})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var l=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(l in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][l])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var n=r.ARIAMapper.nodeToRole(t);n in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[n]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[n][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=l.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var n=e.getUserDefinedRoles(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,r),s=!1;if(n&&n.length>0&&o&&o.length>0){for(var d=0;d<n.length;d++)if(o.includes("any")||o.includes(n[d])){if(o.includes("any")&&"generic"===n[d]){s=!0;continue}if(("presentation"===(a=n[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}l.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var l=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),n=0;n<l.length;++n)a.push(l[n]);if(i){var r=e.getImplicitRole(t);null!==r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(r,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=l.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var r=e.getUserDefinedAriaAttributes(t);if(0===r.length)return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=n.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(n.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some((function(e){return r.includes(e)}))){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(n.ARIADefinitions.designPatterns[e]){var i=n.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var l=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var n=t.getAttribute("role").trim().split(" "),r=0;!l&&r<n.length;++r)l=n[r]in i;else for(n=t.getAttribute("role").trim().split(" "),r=0;!l&&r<n.length;++r)l=n[r]===i;if(!l&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(r=0;!l&&r<o.length;++r)l=o[r]in i;else for(r=0;!l&&r<o.length;++r)l=o[r]===i}return l},e.hasRoleInSemantics=function(t,i){var a=!1,l=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var n=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<n.length;++r)l=!0,a=n[r]in i;else for(n=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<n.length;++r)l=!0,a=n[r]===i;if(l)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(r=0;!a&&r<o.length;++r)a=o[r]in i;else for(r=0;!a&&r<o.length;++r)a=o[r]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var l=e.getImplicitRole(t);null!==l&&l.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var l=o.DOMWalker.parentNode(t);null!==l;){if(a){if(e.hasRoleInSemantics(l,i))break}else if(e.hasRole(l,i,!1))break;l=o.DOMWalker.parentNode(l)}return l},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var l=e.getResolvedRole(a);if(null!==l&&i.includes(l))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=l.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(n.ARIADefinitions.designPatterns).forEach((function(e){var a=e[0],l=e[1];t.includes(l.roleType)&&i.push(a)})),l.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=l.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,r=e.getResolvedRole(t);return r&&n.ARIADefinitions.designPatterns[r]&&"widget"===n.ARIADefinitions.designPatterns[r].roleType&&(a=!0),l.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,l){var n=null,r=!1;if(t&&i){for(n=t.nextSibling;null!==n&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(n)||(r=l?e.hasRoleInSemantics(n,i):e.hasRole(n,i,!1)),n=n.nextSibling;if(!n)for(n=t.previousSibling;null!==n&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(n)||(r=e.hasRole(n,i,l)),n=n.previousSibling}return n},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,l){for(var n=null,r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(r.node))&&(l?e.hasRoleInSemantics(r.node,i):e.hasRole(r.node,i,!1))){n=r.node;break}return n},e.getAllDescendantsWithRoles=function(t,i,a,l){if(i&&0!==i.length){var n=[];return i.forEach((function(i){var r=e.getAllDescendantsWithRoleHidden(t,i,a,l);r&&r.length>0&&(n=n.concat(r))})),n}},e.getAllDescendantsWithRoleHidden=function(t,i,a,l){for(var n=[],r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)r.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(r.node)||e.hasRole(r.node,i,l)&&n.push(r.node);return n},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var l=[];if(null!==t.children&&t.children.length>0)for(var n=0;n<t.children.length;n++)l.push(t.children[n]);var r=t.getAttribute("aria-owns");if(r){var o=t.ownerDocument;if(o){var u=r.split(" ");for(n=0;n<u.length;n++){var d=o.getElementById(u[n]);d&&l.push(d)}}}if(l.length>0){for(n=0;n<l.length;n++)if(!s.VisUtil.isNodeHiddenFromAT(l[n])&&s.VisUtil.isNodeVisible(l[n])){var c=e.getRoles(l[n],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(l[n])),c&&null!==c&&c.length>0&&(c=c.filter((function(e){return"none"!==e&&"presentation"!==e}))).includes("group")&&i&&i.includes("group")&&(c=c.filter((function(e){return"group"!==e}))),c&&null!==c&&c.length>0?a.push(l[n]):e.retrieveDirectATChildren(l[n],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var l=["none","presentation"];if(a.some((function(e){return l.includes(e)})))return null;for(var r=n.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)r[a[s]]&&null!==r[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(r[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,l){var n=null,r=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(n=d.FragmentUtil.getById(t,o),c.DOMUtil.sameNode(t,n))return null;r=a&&null!=n&&u.CommonUtil.shouldNodeBeSkippedHidden(n)?null:e.hasRole(n,i,l)}return r?n:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(e,t){if(0===e.length)return!1;var i=e[0].ownerDocument,a=!1,n=null;t&&(n=l.CacheUtil.getCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===n&&(n={});for(var r=0;!a&&r<e.length;++r)if(e[r].hasAttribute)if(e[r].hasAttribute("aria-label")){var o=u.CommonUtil.normalizeSpacing(e[r].getAttribute("aria-label")).toLowerCase();a=o in n,n[o]=!0}else if(e[r].hasAttribute("aria-labelledby")){var s=e[r].getAttribute("aria-labelledby"),m=d.FragmentUtil.getById(e[r],s),p=m&&!c.DOMUtil.sameNode(m,e[r])?u.CommonUtil.getInnerText(m):"",h=u.CommonUtil.normalizeSpacing(p).toLowerCase();a=h in n,n[h]=!0}else a=!0;return t&&l.CacheUtil.setCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",n),!a},e.getAriaLabel=function(e){if(e.hasAttribute){if(e.hasAttribute("aria-labelledby")){for(var t=e.getAttribute("aria-labelledby").trim().split(" "),i="",a=0,l=t.length;a<l;++a){var n=t[a],r=d.FragmentUtil.getById(e,n),o=r&&!c.DOMUtil.sameNode(r,e)?u.CommonUtil.getInnerText(r):"";i+=u.CommonUtil.normalizeSpacing(o).toLowerCase()}return i.trim()}if(e.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(e.getAttribute("aria-label")).toLowerCase().trim()}return""},e.getAriaDescription=function(e){if(!e)return"";var t="",i=e.getAttribute("aria-labelledby");if(i&&i.trim().length>0){for(var a=i.trim().split(" "),l=0,n=a.length;l<n;++l){var r=a[l],o=d.FragmentUtil.getById(e,r),s=o&&!c.DOMUtil.sameNode(o,e)?u.CommonUtil.getInnerText(o):"";s&&s.trim().length>0&&(t+=u.CommonUtil.normalizeSpacing(s).toLowerCase())}if(t.trim().length>0)return t.trim()}return(i=e.getAttribute("aria-description"))&&i.trim().length>0?i.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach((function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1})),i},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(e,t){if(0===e.length)return!1;var i=e[0].ownerDocument,a=null,n=new Array;t&&(a=l.CacheUtil.getCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===a&&(a={});for(var r=0;r<e.length;++r)if(e[r].hasAttribute)if(e[r].hasAttribute("aria-label")){var o=u.CommonUtil.normalizeSpacing(e[r].getAttribute("aria-label")).toLowerCase();a[o]=!0,o in n||(n[o]=new Array),n[o].push(e[r].nodeName.toLowerCase())}else if(e[r].hasAttribute("aria-labelledby")){for(var s=e[r].getAttribute("aria-labelledby").trim().split(" "),m="",p=0,h=s.length;p<h;++p){var _=s[p],b=d.FragmentUtil.getById(e[r],_),g=b&&!c.DOMUtil.sameNode(b,e[r])?u.CommonUtil.getInnerText(b):"";m+=u.CommonUtil.normalizeSpacing(g).toLowerCase()}a[m]=!0,m in n||(n[m]=new Array),n[m].push(e[r].nodeName.toLowerCase())}return t&&l.CacheUtil.setCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",a),n},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var l=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=l in i,i[l]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=l.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var r=null;if(t.tagName?r=t.tagName.toLowerCase():t.nodeName&&(r=t.nodeName.toLowerCase()),null==(i=n.ARIADefinitions.documentConformanceRequirement[r])){var o=n.ARIADefinitions.documentConformanceRequirementSpecialTags[r];switch(r){case"a":case"area":i=u.CommonUtil.attributeNonEmpty(t,"href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,m=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==m&&m.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&c.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()}))[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":i=null!==e.getAncestorWithRole(t,"table",!0)||null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===u.CommonUtil.getScopeForTh(t)?o["des-table-grid-treegrid-column-scope"]:o["des-table-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var _=t.parentElement;i=null!==_&&"dl"===_.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=n.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return l.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=l.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var n;if(null!=(n=null!=i?i:e.getElementAriaProperty(t))){null!==n.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(n.implicitRole,a),null!==n.validRoles&&u.CommonUtil.concatUniqueArrayItemList(n.validRoles,a);var r=e.getImplicitRole(t);r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(n.validRoles,a)}l.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,r){var o=l.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];n.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),n.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),n.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=r&&void 0!==r?r:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=n.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var _=h.props;u.CommonUtil.concatUniqueArrayItemList(_,o),_=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(_,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=n.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var g=n.ARIADefinitions.designPatterns[s[p]];if(null!=g){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=g.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=g.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var y=[],w=0;w<m.otherAllowedAriaAttributes.length;w++)if((x=m.otherAllowedAriaAttributes[w]).includes("=")){var k=x.split("=");t.getAttribute(k[0])===k[1]&&y.push(k[0])}else y.push(x);y.length>0&&u.CommonUtil.concatUniqueArrayItemList(y,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var C=[];for(w=0;w<m.otherDisallowedAriaAttributes.length;w++){var x;(x=m.otherDisallowedAriaAttributes[w]).includes("=")?(k=x.split("="),t.getAttribute(k[0])===k[1]&&C.push(k[0])):C.push(x)}C.length>0&&u.CommonUtil.concatUniqueArrayItemList(C,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),l.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=n.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var l=[],r=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;r=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;r=a.overlapping}for(var o=!1,s=!1,u=0;u<r.length;u++)for(var d=r[u].ariaAttributeValue,c=r[u].htmlAttributeNames,m=r[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var _=null===m||null===m[h]?null:m[h].split(",");null===d?(null===_||_.includes(t[p].value))&&(l.push({result:"Failed",attr:t[p].name}),s=!0):null===_?d===e.value&&(l.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&_.includes("VALUE")&&_[0]!==e.value||d===e.value&&_.includes(t[p].value))&&(l.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&l.push({result:"Pass",attr:""}),l}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var l=n.ARIADefinitions.designPatterns[i[a]];if(null!=l&&!0===l.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=r.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=n.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),l=e.getAllowedAriaRoles(t,a);if(!l||0===l.length)return i;var n=[];if(l.includes("any"))return[];for(var r=0;r<i.length;r++)l.includes(i[r])||n.includes(i[r])||n.push(i[r]);return n},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var l=n.ARIADefinitions.designPatterns,r=0;r<i.length;r++)i[r]in l||a.push(i[r]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var l=[];i&&0!=i.length||(i=e.getImplicitRole(t));var n=e.getUserDefinedAriaAttributes(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,r);if(n)for(var s=0;s<n.length;s++){var u=n[s].trim().toLowerCase();o.includes(u)||l.includes(u)||l.push(u)}return l},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),l=[];if(i&&i.length>0&&a&&a.length>0)for(var n=function(t){var n=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===n)return"continue";n.forEach((function(e){"Failed"===e.result&&l.push({ariaAttr:i[t].name,htmlAttr:e.attr})}))},r=0;r<i.length;r++)n(r);return l},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var l=n.ARIADefinitions.globalDeprecatedRoles,r=0;r<i.length;r++)l.includes(i[r])&&a.push(i[r]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var l=0;l<i.length;l++){var r=i[l].name;"aria-"===r.substring(0,5)&&a.push(r)}if(0===a.length)return[];var o=[],s=n.ARIADefinitions.globalDeprecatedProperties;for(l=0;l<a.length;l++)s.includes(a[l])&&o.push({role:"any",attribute:a[l]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(l=0;l<u.length;l++){var d=n.ARIADefinitions.designPatterns[u[l]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[l],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=m},1775:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(7788),l=i(8137),n=i(490),r=i(5697),o=i(7440),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){try{if(""===t.trim())return!1;if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);for(var i=(e.document||e.ownerDocument).querySelectorAll(t),a=0;a<i.length&&i[a]!==e;)++a;return a<i.length}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getDefinedStyles=function(t,i){if(!t)return null;var l={},n={};function r(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,l=e;a<l.length;a++){var n=l[a];for(var r in n)delete n[r]}break}r=t[i];for(var o=0,s=e;o<s.length;o++){n=s[o];var u=t.getPropertyPriority(r);if(r in n&&n[r].endsWith("!important")){if("important"!==u||n[r].startsWith("inherit")||n[r].startsWith("unset"))continue;n[r]=t[r]+" !important"}else n[r]=t[r]+("important"===u?" !important":"")}}}var o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);if(!i&&o)l=o.definedStyles,n=o.definedStylePseudo;else{for(var s=0;s<t.ownerDocument.styleSheets.length;++s){var u=t.ownerDocument.styleSheets[s];try{if(u&&u.cssRules)for(var d=0;d<u.cssRules.length;++d){var c=u.cssRules[d],m=c.selectorText;if(m){var p=m.match(/^(.*)(:[a-zA-Z-]*)$/),h=!!p,_=h?p[1]:m,b=(h?p[2]:"")===i;i&&":focus"===i&&(_=_.replace(/([ >][^+~ >]+):focus-within/g,"$1")),!h&&e.selectorMatchesElem(t,_)&&r([l,n],c.style),b&&e.selectorMatchesElem(t,_)&&r([n],c.style)}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}r([l,n],t.style),a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",{definedStyles:l,definedStylePseudo:n})}if(i){for(var g in n)n[g]===l[g]&&delete n[g];return n}return l},e.getMediaOrientationTransform=function(e){for(var t={},i=0;i<e.styleSheets.length;++i){var a=e.styleSheets[i];try{if(a&&a.cssRules)for(var l=0;l<a.cssRules.length;++l){var n=a.cssRules[l];if(4===n.MEDIA_RULE){var r=n;if(r&&r.media)for(var o=r.media,s=0;s<o.length;s++)if(o.item(s)){var u=t[o.item(s).toLocaleLowerCase()];u||(u={});for(var d=r.cssRules,c=0;c<d.length;++c){if(1===d[c].STYLE_RULE){var m=d[c],p=m.selectorText;if(p)for(var h={},_=m.style,b=0;b<_.length;++b){var g=_[b];if("transform"===g.toLocaleLowerCase()){if("all"===g&&_[g]){delete h[g];break}h[g]=_[g]}else"rotate"===g.toLocaleLowerCase()&&(h[g]=_[g]);u[p]=h}}o.item(c)&&(t[o.item(c).toLocaleLowerCase()]=u)}}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return t},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var l=i[a].trim();if(""!==l)if(l.startsWith("rotate3d")){var n=l.indexOf("("),r=l.indexOf(")");if(-1!==n&&-1!==r){var o=l.substring(n+1,r),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(l.startsWith("rotate")||l.startsWith("rotateZ")){if(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r){var d;if(!(d=l.substring(n+1,r)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(l.startsWith("matrix3d")){if(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r&&(o=l.substring(n+1,r),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else l.startsWith("matrix")&&(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r&&(o=l.substring(n+1,r),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var l=e.convertValue2Pixels(a[2],a[1],i);return null===l?l:parseFloat(l)},e.convertValue2Pixels=function(e,t,i){if(0==t)return 0;var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t)["font-family"],l=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(l=!0),!l){var n=t.classList;for(var r in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(n.contains(r)){l=!0;break}}if(!l)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var l=t.substring((""+a).length);return e.convertValue2Pixels(l,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var l={},n=void 0;null!=(n=i.exec(t));)l[n[1]]=n[2].trim().toLowerCase();var r=[{selector:null,values:l}];return e.IBM_CSS_THB=r,r}r=[],n=void 0;for(var o=void 0;null!=(n=a.exec(t));){l={};for(var s=n[1],u=n[2];null!=(o=i.exec(u));)l[o[1]]=o[2].trim().toLowerCase();r.push({selector:s,values:l})}return e.IBM_CSS_THB=r,r},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var n=new r.DOMMapper,o=n.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return l.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(l.CommonUtil.isTarget(e)&&o.width<24){var a=n.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return l.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=n.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,l){void 0===l&&(l=[]);for(var n=t;null!==n;){var r=a.CacheUtil.getCache(n,"AriaUtil_AncestorWithStyles",null);if(r)return r;var s=e.getDefinedStyles(n);for(var u in i){var d=s[u];if(d&&(d=d.split(" ")[0],!l.includes(d))){if(i[u].includes("*"))return a.CacheUtil.setCache(n,"AriaUtil_AncestorWithStyles",n),n;if(i[u].includes(d))return a.CacheUtil.setCache(n,"AriaUtil_AncestorWithStyles",n),n}}n=o.DOMWalker.parentElement(n)}return a.CacheUtil.setCache(t,"AriaUtil_AncestorWithStyles",void 0),null},e}();t.CSSUtil=s},7788:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(7440),l=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.clearCaches=function(e){delete e.ownerDocument.aceCache;var t=new a.DOMWalker(e,!1,e,!0);do{delete t.node.aceCache,t.node.ownerDocument&&delete t.node.ownerDocument.aceCache}while(t.nextNode())},e}();t.CacheUtil=l},8680:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(7440),l=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new n(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new n(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new n(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var l=parseInt(t.substring(1,3),16),r=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new n(l,r,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var l=i.defaultView;if(!l)return null;for(var n=[],r=t;r;)1===r.nodeType&&n.push(r),r=a.DOMWalker.parentElement(r);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=l.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,l=null,n=1;n<e.length;++n){for(var r=e[n-1],o=i.contrastRatio(e[n-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[n].mix(e[n-1],u+s).getOverlayColor(t));)r=e[n].mix(e[n-1],u+s).getOverlayColor(t),o=i.contrastRatio(r),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[n].mix(e[n-1],u-s).getOverlayColor(t));)r=e[n].mix(e[n-1],u-s).getOverlayColor(t),o=i.contrastRatio(r),u-=s;s/=10}(null===l||l>o)&&(l=o,a=r)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,_=null;n.length>0;){var b,g=n.pop();if(null!==(b=l.getComputedStyle(g))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],y=0;y<v.length;++y)if(v[y].length){var w=e.Color(v[y]);if(void 0!==w.alpha&&w.alpha<1){var k=_||m;w=w.getOverlayColor(k)}A.push(w)}else v.splice(y--,1);f=c(A,_||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=_&&(_.alpha=p*h,m=_.getOverlayColor(m)),p=1,h=null,_=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(_=f).alpha||1,delete _.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===_?(h=(_=f).alpha||1,delete _.alpha):h=(_=f.getOverlayColor(_)).alpha||1,1===p&&1===h&&1===(_.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=_&&delete(u=u.getOverlayColor(_)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=_&&(_.alpha=p*h,m=_.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=l;var n=function(){function e(e,t,i,a){function l(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=l(e),this.green=l(t),this.blue=l(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var l in e)a+=l+"\n";alert(e),alert(a)}var n=e.relativeLuminance();return i>n?(i+.05)/(n+.05):(n+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,l=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*l)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,n=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var r=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(r)))return null;i=o[1],a=o[2],n=o[3]}else if(t.startsWith("rgba(")){var o;if(r=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(r)))return null;i=o[1],a=o[2],n=o[3]}else{if("#"!=t.charAt(0)){if(!(t in l.CSSColorLookup))return null;t=l.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),n=s(t.substring(5,7))}return new e(i,a,n)},e}();t.ColorObj=n},8137:function(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,l=0,n=t.length;l<n;l++)!a&&l in t||(a||(a=Array.prototype.slice.call(t,0,l)),a[l]=t[l]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var l=i(8235),n=i(7788),r=i(490),o=i(1421),s=i(8656),u=i(295),d=i(7440),c=i(482),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!!t.hasAttribute("contenteditable")},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!r.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter((function(e){return["table","grid","treegrid"].includes(e.role)})):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var l=i.split(" "),n=t.ownerDocument,r=0;r<l.length;r++){var o="//*[@id='"+l[r]+"']";n.evaluate(o,t,n.defaultNSResolver,0,null).iterateNext()||(a+=l[r]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=n.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),n.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,l){for(var n=[],r=t.firstChild;null!=r;){if(r.nodeName.toLowerCase()===i){if((a||l&&!e.shouldCheckHiddenContent(r))&&!s.VisUtil.isNodeVisible(r)){r=r.nextSibling;continue}n.push(r)}r=r.nextSibling}return n},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,l){var o=null;if(null===(o=l?n.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):n.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&l){var m=r.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}l?n.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):n.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var _=i;(i=[]).push(_)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var g=0;g<b.length;++g)h.push(b[g])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=r.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===r.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var l=t.nodeName.toLowerCase();if("object"!=l&&"embed"!=l&&"a"!=l&&"area"!=l)return!1;var n=!1;if(!n&&t.hasAttribute("type")&&(n=a(t.getAttribute("type").toLowerCase())),!n&&t.hasAttribute("codetype")&&(n=a(t.getAttribute("codetype"))),!n){var r="";"embed"===l?r=t.getAttribute("src"):"a"===l||"area"===l?r=t.getAttribute("href"):t.hasAttribute("data")&&(r=t.getAttribute("data")),null===r&&(r=""),n=i(e.getFileExt(r))}if(!n&&"object"===l)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!n&&null!=o&&s<o.length;++s)n=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return n},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,(function(e){return e.startsWith("audio")}))},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,(function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")}))},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,(function(e){return e.startsWith("image")}))},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return n.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=n.CacheUtil.getCache(e,t,!1);return n.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var l in t)if(t[l]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var l=new d.DOMWalker(a);l.nextNode();)if(l.node&&1===l.node.nodeType&&l.elem()&&(l.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(l.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!n.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var l={},r=e.getDocElementsByTag(t,"label"),o=0;o<r.length;++o)if(r[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(r[o]))continue;l[r[o].getAttribute("for")]=r[o]}n.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",l)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return n.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!l.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),n=!1,r=0;a<a.length;++r){var o=document.getElementById(a[r]);if(o&&!u.DOMUtil.sameNode(o,e)){n=!0;break}}return n?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var l=e.getInnerText(a);return l&&""!==l.trim()?l.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,l=e.getLabelForElementHidden(t,!0);if(l)a=l.innerText;else{if(!(l=e.getAncestor(t,"label"))||"label"!==l.tagName.toLowerCase()||!e.isFirstFormElement(l,t))return null;var n=l.cloneNode(!0);n=e.removeAllFormElementsFromLabel(n),a=e.getInnerText(n)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(l,!0))&&""!==a.trim()&&(i+=a.trim()),(a=r.AriaUtil.getAriaLabel(l))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,l=0;l<t.children.length;l++){var n=t.children.item(l);if(e.form_labelable_elements.includes(n.nodeName.toLowerCase())){a=n;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=r.AriaUtil.getResolvedRole(p);if("textbox"===h){var _=p.getAttribute("value");_&&_.trim().length>0&&(m+=" "+_.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var g=p.ownerDocument.getElementById(b);if(g&&!u.DOMUtil.sameNode(p,g)){var f=o.AccNameUtil.computeAccessibleName(g);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=r.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,l=i.length;a<l;++a){var n=c.FragmentUtil.getById(e,i[a]);if(n&&u.DOMUtil.sameNode(n,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),l=e.nodeDepth(i);if(l>a){for(var n=0;n<l-a;++n)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>l){for(n=0;n<a-l;++n)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var l=0;l<i[a].frames.length;++l)try{i[a].frames[l]&&!i.includes(i[a].frames[l])&&i.push(i[a].frames[l])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var l=0,n=t.assignedNodes();l<n.length;l++){var r=n[l];a=a&&e.isInnerTextEmpty(r)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(e){if(!e)return null;if(3===e.nodeType)return e.nodeValue();for(var t="",i=new d.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){if(1===i.node.nodeType&&s.VisUtil.hiddenByDefaultElements.includes(i.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(i.node)||s.VisUtil.isElementOffscreen(i.node)){if(i.node.nextSibling){3===i.node.nextSibling.nodeType&&null!==i.node.nextSibling.nodeValue&&(t+=i.node.nextSibling.nodeValue),i.node=i.node.nextSibling;continue}break}3===i.node.nodeType&&null!==i.node.nodeValue&&(t+=i.node.nodeValue.trim())}return t.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode();)a="img"===l.node.nodeName.toLowerCase()&&e.attributeNonEmpty(l.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode()&&l.node!=t;){var n=l.node;if(!((a="img"===n.nodeName.toLowerCase()&&(e.attributeNonEmpty(n,"alt")||e.attributeNonEmpty(n,"title"))&&!s.VisUtil.isNodeHiddenFromAT(n)&&!s.VisUtil.isNodePresentational(n)||"svg"===n.nodeName.toLowerCase()&&e.svgHasName(n))||1!==n.nodeType||s.VisUtil.isNodeHiddenFromAT(n)||s.VisUtil.isNodePresentational(n)||(a=!e.isInnerTextOnlyEmpty(n))||!0!==i)){a=e.attributeNonEmpty(n,"aria-label")||e.attributeNonEmpty(n,"aria-labelledby");var r=n.ownerDocument;if(r){var o=r.defaultView;if(o){var u=o.getComputedStyle(n);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(n,"alt"))}}}3===n.nodeType&&d.DOMWalker.parentElement(n)===t&&(a=!e.isInnerTextEmpty(n))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode()&&l.node!=t;)!(a="img"===l.node.nodeName.toLowerCase()&&e.attributeNonEmpty(l.node,"alt"))&&(r.AriaUtil.hasRole(l.node,"button",!0)||r.AriaUtil.hasRole(l.node,"textbox"))&&(r.AriaUtil.hasAriaLabel(l.node)||e.attributeNonEmpty(l.node,"title")||e.getLabelForElementHidden(l.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter((function(t){return!e.includes(t)})):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=function(e){return a([],e.parentElement.children,!0).filter((function(e){return 1===e.nodeType&&"TH"!=e.tagName}))};return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},l=t;l;){if(1===l.nodeType){var n=l;n.hasAttribute("id")&&(a[n.getAttribute("id")]=!0)}l=d.DOMWalker.parentNode(l)}for(var r=t.ownerDocument.querySelectorAll("*[aria-labelledby]"),o=0;o<r.length;++o)for(var s=r[o],u=0,m=s.getAttribute("aria-labelledby").split(" ");u<m.length;u++)if(m[u]in a&&!e.isIdReferToSelf(t,t.getAttribute("aria-labelledby")))return s;return null},e.isNodeDisabled=function(t){var i=n.CacheUtil.getCache(t,"PT_NODE_DISABLED",!1);3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),r=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||r&&l.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,n.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),n.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){return"hidden"!==e.getAttribute("type")&&!e.hasAttribute("disabled")},select:function(e){return!e.hasAttribute("disabled")},textarea:!0,a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()}))[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()})).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},5755:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(8656),l=i(490),n=i(8137),r=function(){function e(){}return e.isDataTable=function(e){return!(l.AriaUtil.hasRole(e,"none")||l.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,l=null,r=t.getElementsByTagName("tr"),o=r.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=r[c].getElementsByTagName("th"),l=r[c].getElementsByTagName("td"),u=a.length,0!==(s=l.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&n.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(l[p].hasAttribute("rowspan")||l[p].hasAttribute("colspan")||l[p].hasAttribute("headers")&&n.CommonUtil.normalizeSpacing(l[p].getAttribute("headers")).split(" ").length>2)&&n.CommonUtil.getAncestor(l[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),_=h.length;_>0&&((i=_>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,l=0;i&&l<t.cells.length;l++){var n=t.cells[l];i=e.isTableCellEmpty(n)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,l=i[0],r=0;a&&r<i.length;r++)(l=i[r]).parentNode&&"tfoot"===l.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(l));if(a)return null;for(a=!0,r=0;a&&r<l.cells.length;r++){var o=l.cells[r];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(r=0;a&&r<i.length;r++)for(var c=i[r],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?n.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&n.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every((function(e){return u.includes(e)})))},e.isLayoutTable=function(e){return l.AriaUtil.hasRole(e,"presentation")||l.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter((function(e){return["table","grid","treegrid"].includes(e.role)})):null},e}();t.TableUtil=r},8656:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(7788),l=i(295),n=i(7440),r=i(5697),o=i(490),s=i(1775),u=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=n.DOMWalker.parentNode(t));var i,l=t;if(1!==l.nodeType)return!0;if(!l.ownerDocument)return!0;var r=l.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(r)>-1)return!1;if(void 0!==a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",void 0))return a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",void 0);if(a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",!1)),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(r)){if(!l.ownerDocument.defaultView)return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),!0;i=l.ownerDocument.defaultView.getComputedStyle(l,null);var o=l.getAttribute("hidden"),s=a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",void 0),u="boolean"==typeof l.hidden&&l.hidden;if(!i&&!u&&null==o&&!s)return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),!0;if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(l,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(u||null!=o||s))return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!1),!1;if(e.isContentHidden(l))return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!1),!1}var d=n.DOMWalker.parentNode(l);if(null!=d&&1===d.nodeType){a.CacheUtil.setCache(d,"Visibility_Check_Parent",!0);var c=e.isNodeVisible(d);return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",c),c}return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),!0},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,l=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===l){var r=s.CSSUtil.getDefinedStyles(i);if("absolute"===r.position&&r.clip&&"rect(0px,0px,0px,0px)"===r.clip.replaceAll(" ","")||r.opacity&&parseFloat(r.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=n.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return l},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new r.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?l.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=u},4976:e=>{e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}},t={};function i(a){var l=t[a];if(void 0!==l)return l.exports;var n=t[a]={exports:{}};return e[a].call(n.exports,n,n.exports,i),n.exports}var a={};(()=>{var e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(2306);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var l=i(7884);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return l.Checker}});var n=i(4944);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return n.ARIAMapper}});var r=i(3962);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return r.Config}});var o=i(7440);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}}),String.prototype.startsWith=String.prototype.startsWith||function(e){return 0===this.indexOf(e)},String.prototype.includes=String.prototype.includes||function(e){return-1!==this.indexOf(e)},Array.prototype.includes=Array.prototype.includes||function(e){return-1!==this.indexOf(e)},e.checkDemo=function(e){e||(e=0);var t=new l.Checker;setTimeout((function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then((function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort((function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)}));for(var a=null,l=null,n=0,r=e.results;n<r.length;n++){var o=r[n];l!==o.category&&(null!==l&&(console.groupEnd(),console.groupEnd(),a=null),l=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()}))}),e)}})(),module.exports=a})(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2024.12.12/js/ace-node.js.LICENSE.txt b/rule-server/src/static/archives/2024.12.12/js/ace-node.js.LICENSE.txt new file mode 100644 index 000000000..614ccacb5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/js/ace-node.js.LICENSE.txt @@ -0,0 +1,15 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/rule-server/src/static/archives/2024.12.12/js/ace.js b/rule-server/src/static/archives/2024.12.12/js/ace.js new file mode 100644 index 000000000..2f1b6f53b --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/js/ace.js @@ -0,0 +1,2 @@ +/*! For license information please see ace.js.LICENSE.txt */ +var ace;(()=>{"use strict";var e={8235:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-grid-treegrid-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-grid-treegrid-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var l in i.designPatterns){var n=i.designPatterns[l].container;if(null!==n)for(var r=0,o=n;r<o.length;r++){var s=o[r];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},4944:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var n=i(8235),r=i(1794),o=i(295),s=i(8137),u=i(490),d=i(482),c=i(8015),m=i(7788),p=i(7440),h=i(1421),_=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in n.ARIADefinitions.designPatterns&&n.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){for(var a=e,l=0;l<a.attributes.length;++l){var n=a.attributes[l],r=n.name.toLowerCase();r.startsWith("aria-")&&(i[r.substring(5)]=n.nodeValue)}var o=function(e){if(e in t.elemAttrValueCalculators)for(var l in t.elemAttrValueCalculators[e])if(!(l in i)){var n=t.elemAttrValueCalculators[e][l];null!=n&&("string"!=typeof n&&(n=n(a)),i[l]=n)}};o("global"),o(e.nodeName.toLowerCase())}else if(3===e.nodeType)for(var s in t.textAttrValueCalculators){var u=t.textAttrValueCalculators[s](e);null!=u&&(i[s]=u)}return i},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var l=i[a],n=l.getAttribute("aria-owns").split(/ +/g),r=0;r<n.length;++r){var s=t.getElementById(n[r]);s&&!o.DOMUtil.sameNode(l,s)&&m.CacheUtil.setCache(s,"aria-owned",l)}m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],l=0,n=s;l<n.length;l++){var r=n[l];a.push(r)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||"none",rolePath:i.rolePath+"/"+(this.getRole(e)||"none"),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};"none"===i.role||"/none"===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||"none",rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role="none","none"!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)r=h[c],a.push(r);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var l=new c.ARIAWalker(a,!1,a);do{1===l.node.nodeType&&this.getNodeHierarchy(l.node)}while(l.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role.substring(1));return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),"none"!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var l=a[i];t.push(l)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var n=p.DOMWalker.parentElement(e);this.hierarchyResults=n?m.CacheUtil.getCache(n,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var l=a[i];if("presentation"===l||"none"===l){if(!s.CommonUtil.isFocusable(t))return null}else if(l in n.ARIADefinitions.designPatterns)return l}var r=u.AriaUtil.getImplicitRole(t),o=r&&0!==r.length?r[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:h.AccNameUtil.computeAccessibleName},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){return"checkbox"===e.getAttribute("type")||"radio"===e.getAttribute("type")?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=t.querySelectorAll("li"),a=t.querySelectorAll("ol li, ul li, menu li");return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=t.querySelectorAll("li"),a=0,l=0;l<i.length;++l){var n=i[l];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(n,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(r.CommonMapper);t.ARIAMapper=_},8015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(482),l=i(4944),n=i(8656),r=i(7440),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(r.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&n.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&n.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,r.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=r.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&l.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&n.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&n.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,r.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=r.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(r.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&l.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},9193:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},482:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter((function(e){return e.role===t}));return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter((function(e){return e.role===t}));return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},2527:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},1794:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(7440),l=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var l=0,n=t=t.reverse();l<n.length;l++){for(var r=n[l],o=[],s=r.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(r)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||"none";if(this.hierarchyRole.push(t),"none"!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){"none"!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var l=a[i];t.push(l)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=l},2306:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,l){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=l,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var l=i.attrs,n=e[i.namespace][t],r=!0,o=0,s=l;o<s.length;o++){var u=s[o];r=r&&u.matches(n)}return i.inclusive||(r=!r),r},e}();t.PartInfo=a;var l=function(){function e(e){this.contextInfo=[];for(var t=[],l=0,n=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);l<n.length;l++){for(var r=n[l].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=r[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}r[2]=r[2].toLowerCase();var c=r[2].split(":"),m="!"!==r[1],p=c.shift(),h=c.join(":"),_=new a(m,p,h,o,r[r.length-1]);t.push(_)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],l=0;l<i.length;++l){var n=new e(i[l]);a.push(n)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var l=a[i];t.push(l)}return t},e}();t.Context=l},9324:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(7440),l=i(2306),n=i(3962),r=i(5697),o=i(295),s=i(7788),u=i(4377),d=i(8656),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,n.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.prototype.run=function(t,i,a,l){var n,r=(new Date).getTime();try{n=this.rule.run(i,a,l)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();n||(n=[]),n instanceof Array||(n=[n]);for(var u=[],d=0,c=n;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var _ in i)h[_]=i[_].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-r,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node)})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.inclRules={},this.exclRules={},this.addMapper(new r.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1),s.CacheUtil.clearCaches(e);var i=new a.DOMWalker(e,!1,e,!0),l={results:[],numExecuted:0,ruleTime:0,totalTime:0},n=(new Date).getTime();for(var r in this.mappers)this.mappers[r].reset(e);do{var c={};for(var r in this.mappers)i.bEndTag?c[r]=this.mappers[r].closeScope(i.node):c[r]=this.mappers[r].openScope(i.node);if(11!==i.node.nodeType&&(d.VisUtil.isNodeVisible(i.node)||"meta"===i.node.nodeName.toLowerCase()||"style"===i.node.nodeName.toLowerCase()||"datalist"===i.node.nodeName.toLowerCase()||"param"===i.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(i.node,["body"]))){var m={};for(var p in c){var h=c[p],_=h[h.length-1];m[p]=_}for(var b={},g=0,f=this.getMatchingRules(c);g<f.length;g++){for(var v=f[g],A=!0,y=0,w=v.rule.dependencies||[];y<w.length;y++)b[w[y]]||(A=!1);if(A){var k=[];try{k=v.run(this,m,t,c)}catch(e){}0===k.length&&(b[v.rule.id]=!0);for(var C=0,x=k;C<x.length;C++){var P=x[C];l.results.push(P),l.ruleTime+=P.ruleTime,l.numExecuted++,P.value[1]===u.eRuleConfidence.PASS&&(b[P.ruleId]=!0)}}}}}while(i.nextNode());return s.CacheUtil.clearCaches(e),l.totalTime=(new Date).getTime()-n,Promise.resolve(l)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=l.Context.parse(e.context),a=0,n=e.id;if(n in this.ruleMap)console.log("WARNING: Rule",n,"already added to engine. Ignoring...");else{this.ruleMap[n]=e;for(var r=0,o=i;r<o.length;r++){var s=o[r],u=n;a>=1&&(u=n+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort((function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0}));for(var e in this.exclRules)this.exclRules[e].sort((function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0}))},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var l=this.nlsMap[e][t||0];return l?l.replace(/\{(\d+)\}/g,(function(e,t,a){return i[t]})):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(n.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,l=i[a].namespace,n=t[l][t[l].length-1],r=n.node;if(!i[a].matches(t,t[l].length-1))return!1;if(1===i.length)return!0;if(n=t[l=i[0].namespace][t[l].length-1],--a,i.slice(0,i.length-1).some((function(e){return e.namespace!==l})))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[l].length-(n.node.isSameNode(r)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var l=0,n=a;l<n.length;l++){var r=n[l];r.rule.enabled&&e.match(r,t)&&i.push(r)}}for(var l in t){var n=l+":"+(t[l].length>0?t[l][t[l].length-1].role:"none");for(var r in n in this.inclRules&&a(this.inclRules[n]),this.exclRules)r!==n&&a(this.exclRules[r]);n!==l+":none"&&(n.startsWith(l+":/")?l+":/*"in this.inclRules&&a(this.inclRules[l+":/*"]):l+":*"in this.inclRules&&a(this.inclRules[l+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var l=a[i];t.push(l)}var n=[],r={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in r)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in r||(d=!1);d&&(o=!0,n.push(u),r[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return n},e}();t.Engine=m},3962:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},5697:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var n=i(1794),r=i(7788),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var l=i.attributes[a];t[l.name.toLowerCase()]=l.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0===t){var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+l)*i),top:Math.ceil((a.top+n)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return r.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null}return t},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0===t){var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,n={left:Math.ceil(i.left+a),top:Math.ceil(i.top+l),height:Math.ceil(i.height),width:Math.ceil(i.width)};return r.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",n),n}return null}return t},t}(n.CommonMapper);t.DOMMapper=o},295:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(7440),l=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],l=e.getAncestor(t,a),n=e.getAncestor(i,a);if(null!==l&&null!=n&&e.sameNode(l,n))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var l=a[i];t.push(this.objectCopyWithNodeRefs(l))}}else for(var n in t={},e)t[n]=this.objectCopyWithNodeRefs(e[n]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var l=a.DOMWalker.parentNode(e);null!==l;){if(1===l.nodeType&&l.getAttribute(t)===i)return l;l=a.DOMWalker.parentNode(l)}return null},e}();t.DOMUtil=l},7440:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(8656),l=function(){function e(e,t,i,a,l){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!l,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],l=a.assignedNodes(),n=0;n<l.length;++n)l[n].slotOwner=a,l[n].slotIndex=n},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},l=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var n=this.node.slotOwner,r=this.node.slotIndex+1;r<n.assignedNodes().length?(this.node=n.assignedNodes()[r],this.bEndTag=!1):(this.node=n,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(l,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var l=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=l}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild?(l=this.node,this.node=i.shadowRoot,this.node.ownerElement=l,e.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=l},1970:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.StyleMapper=void 0;var n=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.getRole=function(e){return"computed"},t.prototype.getNamespace=function(){return"css"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=i.ownerDocument.defaultView.getComputedStyle(i),l=0;l<a.length;++l){var n=a[l].toLowerCase();t[n]=a[n]}return t},t}(i(1794).CommonMapper);t.StyleMapper=n},3005:(e,t)=>{var i,a,l;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(l=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",l.LEVEL_TWO="2",l.LEVEL_THREE="3",l.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},4377:(e,t,i)=>{var a,l;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(l=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var n=i(3005);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return n.eToolkitLevel}});var r=i(3005);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return r.eGuidelineCategory}});var o=i(3005);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7884:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var a=i(4377),l=i(9324),n=i(4944),r=i(1970),o=i(1070),s=i(8081),u=i(3005),d=[],c={},m={};!function(){var e=JSON.parse(JSON.stringify(l.Engine.getLanguages()));for(var t in e.push("en-US"),s){var i=s[t];d.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(c[i.id]=i.messages[n],c[i.id][0]=c[i.id].group),n in i.help){for(var r in m[i.id]={},i.help[n])m[i.id][r]="/".concat(n,"/").concat(i.help[n][r]);c[i.id][0]=c[i.id].group}}for(var u=0,p=i.rulesets;u<p.length;u++)for(var h=p[u],_=0,b=o.a11yRulesets;_<b.length;_++){var g=b[_];if(("string"==typeof h.id?[h.id]:h.id).includes(g.id))for(var f=0,v=g.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof h.num?[h.num]:h.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:h.reasonCodes,level:h.level,toolkitLevel:h.toolkitLevel}))}}}}();var p=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new l.Engine;e.addMapper(new n.ARIAMapper),e.addMapper(new r.StyleMapper),e.addRules(d),e.addNlsMap(c),e.addHelpMap(m);for(var t=0,i=o.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var l=a[i];l.rules=l.rules||[];for(var n=0,r=l.rules;n<r.length;n++){var o=r[n];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],l=!1,n=0,r=a.checkpoints;n<r.length;n++)for(var o=0,s=r[n].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(l=!0,delete u.enabled)}l&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],l=!1,n=0,r=a.checkpoints;n<r.length;n++)for(var o=0,s=r[n].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(l=!0,u.enabled=!1)}l&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter((function(t){return t.id!==e})),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map((function(e){return e.id}))},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,l=t;a<l.length;a++){var n=l[a];n in this.rulesetRules&&(i=i.concat(this.rulesetRules[n]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var r=this;return this.engine.run(e).then((function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var l=a[i];l.ruleId in c&&(e.nls[l.ruleId]=e.nls[l.ruleId]||{0:c[l.ruleId][0]},l.reasonId in c[l.ruleId]&&(e.nls[l.ruleId][l.reasonId]=c[l.ruleId][l.reasonId]));var n=l.reasonId?l.reasonId:"None";l.value[0]=r.getReasonLevel(t,l.ruleId,n),l.category=r.getCategory(t,l.ruleId),delete l.path.css}return e}))},e.prototype.getLevel=function(e,t){if(!e)return a.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],l=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,r=e;n<r.length;n++){var o=r[n];o in i&&(i[o]===a.eRulePolicy.VIOLATION?l=a.eRulePolicy.VIOLATION:i[o]===a.eRulePolicy.RECOMMENDATION&&null===l?l=a.eRulePolicy.RECOMMENDATION:null===l&&(l=a.eRulePolicy.INFORMATION))}}if(null===l)throw new Error("Rule triggered for which we have no rule level information: "+t);return l},e.prototype.getReasonLevel=function(e,t,i){if(!e)return a.eRulePolicy.INFORMATION;var l=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var r=function(e){if(e in l){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(l[e]).forEach((function(i){var r=null;"None"===i?r=l[e].None:t.test(i)&&(r=l[e][i]),null!==r&&(r===a.eRulePolicy.VIOLATION?n=a.eRulePolicy.VIOLATION:r===a.eRulePolicy.RECOMMENDATION&&null===n?n=a.eRulePolicy.RECOMMENDATION:null===n&&(n=a.eRulePolicy.INFORMATION))})),null===n&&(n=a.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)r(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return u.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,l=e;a<l.length;a++){var n=l[a];if(n in i)return i[n]}return u.eGuidelineCategory.OTHER},e}();t.Checker=p},8980:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(8137),l=i(8656),n=i(4377),r=i(4377);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:r.eRulePolicy.RECOMMENDATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(r)&&!a.CommonUtil.isTabbable(r))return null;var o={paramWinText:{value:["new window","new tab"],type:"array"}},s=r.getAttribute("target"),u="_parent"==s||"_self"==s||"_top"==s||null!=a.CommonUtil.getFrameByName(r,s);if(!u){var d=a.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(d+=" "+r.getAttribute("title"));for(var c=0;!u&&c<o.paramWinText.value.length;++c)-1!=d.indexOf(o.paramWinText.value[c])&&(u=!0)}return u?(0,n.RulePass)("pass"):(0,n.RulePotential)("potential_warn")}}},3961:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(4377),l=i(8137),n=i(8656),r=i(4377),o=i(1421);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(i)||l.CommonUtil.isNodeDisabled(i))return null;var r=o.AccNameUtil.computeAccessibleName(i);return r&&r.name&&r.name.trim().length>0||l.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},1445:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(8137),l=i(8656),n=i(4377),r=i(4377);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(r))return null;if(a.CommonUtil.attributeNonEmpty(r,"alt")){var o=r.getAttribute("alt").trim();return r.hasAttribute("code")&&o==r.getAttribute("code").trim()?(0,n.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(r)?(0,n.RulePass)("Pass_0"):(0,n.RuleFail)("Fail_3")}return(0,n.RuleFail)("Fail_1")}}},876:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(490),l=i(8656),n=i(4377),r=i(4377);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var r=!0,o=e.dom.node.childNodes,s=0;r&&s<o.length;s++)1===o[s].nodeType?l.VisUtil.isNodeVisible(o[s])&&(r=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(r=0===o[s].nodeValue.trim().length);return r?(0,n.RulePass)("Pass_0"):(0,n.RulePotential)("Potential_1")}}},2768:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(8137),l=i(8656),n=i(4377),r=i(4377);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(r)?null:a.CommonUtil.attributeNonEmpty(r,"alt")?(0,n.RulePass)("Pass_0"):(0,n.RuleFail)("Fail_1")}}},2533:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8656),o=i(1421);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:form, aria:heading, aria:rowheader, aria:table, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var s=l.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){if("table"===s&&l.firstElementChild&&"caption"===l.firstElementChild.nodeName.toLowerCase()&&l.firstElementChild.textContent&&l.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var u=n.AriaUtil.getRolesUndefinedByAria(l);if(u&&u.length>0)return null;var d=n.AriaUtil.getDeprecatedAriaRoles(l);if(d&&d.length>0)return null;var c=n.AriaUtil.getDeprecatedAriaAttributes(l);if(c&&c.length>0)return null;var m=n.AriaUtil.getResolvedRole(l),p=o.AccNameUtil.computeAccessibleName(l);return p&&p.name&&0!==p.name.trim().length?(0,a.RulePass)("pass"):"img"===m||"image"===m?(0,a.RuleFail)("fail_no_accessible_name_image",[l.nodeName.toLowerCase(),m]):(0,a.RuleFail)("fail_no_accessible_name",[l.nodeName.toLowerCase(),m])}}}},7178:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!1,o=l.nodeName.toLowerCase();if(l.hasAttribute("class")&&"mbl"==l.getAttribute("class").substring(0,3))return null;if(n.CommonUtil.isNodeDisabled(l))return null;if(0!==l.getAttribute("aria-activedescendant").trim().length){(r=n.CommonUtil.isTabbable(l))||(r=n.CommonUtil.getTabbableChildren(l)>0);var s=new Array;s.push(o);var u=new Array;return u.push(l.getAttribute("aria-activedescendant").split(" ").join(", ")),r?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},9745:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(482),s=i(8656),u=i(295);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.AriaUtil.hasRoleInSemantics(l,"combobox"))return null;var d=n.AriaUtil.getAriaAttribute(l,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(l,d.trim());if(!c||u.DOMUtil.sameNode(d,l))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(l.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(l.hasAttribute("aria-owns"))for(var p=r.CommonUtil.normalizeSpacing(l.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(l,p[h]))&&!u.DOMUtil.sameNode(v,l)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(n.AriaUtil.hasRoleInSemantics(l,"textbox")&&l.hasAttribute("aria-controls")){m=3;var _=r.CommonUtil.normalizeSpacing(l.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<_.length;h++){var b=o.FragmentUtil.getById(l,_[h]);if(b&&!u.DOMUtil.sameNode(b,l)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var g=r.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<g.length;f++){var v;if((v=o.FragmentUtil.getById(l,g[f]))&&!u.DOMUtil.sameNode(v,l)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},8019:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_application_label_unique.html",Fail_1:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"application",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_application_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_application_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},6505:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(4377),l=i(4377),n=i(1421),r=i(8656);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_application_labelled.html",Fail_1:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.AccNameUtil.computeAccessibleName(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},8910:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_article_label_unique.html",Fail_1:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"article",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_article_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_article_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""===d||!(d in u)||u[d]<=1?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3492:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(4377),l=i(4377),n=i(8235),r=i(490);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var l=e.dom.node,o=l.attributes;if(o){for(var s=n.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;r.AriaUtil.isDefinedAriaAttribute(l,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,l.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},5316:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=n.AriaUtil.getInvalidAriaAttributes(l);if(o&&o.length>0)return null;var s=[],u=n.AriaUtil.getUserDefinedAriaAttributes(l);if(!u||0===u.length)return null;for(var d=n.AriaUtil.getConflictAriaAndHtmlAttributes(l),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&r.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},8412:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=[],o=n.AriaUtil.getDeprecatedAriaRoles(l);if(o&&o.length>0)for(var s=0;s<o.length;s++)r.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=n.AriaUtil.getDeprecatedAriaAttributes(l);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?r.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):r.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return r.length>0?r:null}}},172:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235),s=i(8656);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=0,p=n.AriaUtil.getResolvedRole(l);if(p){if(d[p]&&null!=n.AriaUtil.getRoleRequiredProperties(p,l))for(var h=n.AriaUtil.getRoleRequiredProperties(p,l),_=0,b=h.length;_<b;_++)c(l,y=h[_])?(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute(h[_])).length&&u.push(h[_])):"aria-labelledby"==h[_]?"radiogroup"==p&&c(l,"aria-label")&&(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[_]&&"progressbar"==p&&c(l,"aria-valuetext")&&(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var g=n.AriaUtil.getElementAriaProperty(l),f=[];f.push(p);for(var v=n.AriaUtil.getAllowedAriaAttributes(l,f,g),A=(_=0,v.length);_<A;_++){var y;"aria-checked"!=(y=v[_])&&"aria-selected"!=y&&"aria-expanded"!=y&&"aria-orientation"!=y&&"aria-level"!=y||c(l,y)&&(m++,0!=r.CommonUtil.normalizeSpacing(l.getAttribute(y)).length||u.includes(y)||u.push(y))}}var w=new Array,k=0==u.length;return w.push(u.join(", ")),0==m?null:k?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",w)}}}}},9844:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.AriaUtil.getInvalidAriaAttributes(l);if(r&&r.length>0)return null;var o=n.AriaUtil.getConflictAriaAndHtmlAttributes(l);if(o&&o.length>0)return null;var s=l.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=l.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],_=function(e){var t=n.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach((function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))}))};for(c=0;c<u.length;c++)_(c);return h.length>0?h:null}}},9695:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(8235),l=i(490),n=i(8137),r=i(4377),o=i(4377);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=n.CommonUtil.hasAttribute,m=l.AriaUtil.getElementAriaProperty(o),p=l.AriaUtil.getResolvedRole(o);if(p){var h=l.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var _=l.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,g=0,f=h.length;g<f;g++)_.includes(h[g])&&(c(o,h[g])||("aria-labelledby"==h[g]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[g]),b=!0):"aria-valuenow"==h[g]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[g]),b=!0):"aria-controls"==h[g]&&"combobox"==p||(s.push(h[g]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,r.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,r.RuleFail)("fail_missing",v)}}}},1699:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var l=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=l.attributes,p=0;if(m)for(var h=0,_=m.length;h<_;h++){var b=m[h].name;if(n.AriaUtil.isDefinedAriaAttribute(l,b)){var g=c[b],f=r.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,g&&g.values){if(-1==g.values.indexOf(f))if(-1!=g.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===g.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(g.values.toString());else for(var A={},y=0;y<v.length;y++)""==v[y]||g.values.includes(v[y])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[y]),d.push(g.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(g.values.toString())}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#int"===g.type){var w=parseInt(f);(isNaN(w)||""+w!==f)&&(s.push(f),u.push(b))}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#decimal"==g.type){var k=parseFloat(f);isNaN(k)&&(s.push(f),u.push(b))}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#boolean"==g.type){var C=f.trim().toLowerCase();"true"!==C&&"false"!==C&&(s.push(f),u.push(b))}else g&&g.type&&"http://www.w3.org/2001/XMLSchema#string"==g.type||p--}}var x=new Array,P=0==u.length;return x.push(s.join(", ")),x.push(u.join(", ")),x.push(l.nodeName.toLowerCase()),0==p?null:P?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",x)}}},4974:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_label_unique.html",Fail_1:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"banner",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_banner_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_banner_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3054:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"banner")?null===n.AriaUtil.getSiblingWithRoleHidden(l,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},4649:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235),s=i(8656);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(l)||r.CommonUtil.isNodeDisabled(l)||n.AriaUtil.containsPresentationalChildrenOnly(l)||n.AriaUtil.shouldBePresentationalChild(l))){if(n.AriaUtil.hasRole(l,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(l.hasAttribute("class")&&"mbl"==l.getAttribute("class").substring(0,3))return null;if("datalist"===l.nodeName.toLowerCase())return null;var u=l.getAttribute("role").trim().toLowerCase().split(/\s+/),d=l.getAttribute("id");if(d&&d.trim().length>0){var c=l.ownerDocument.querySelector("*[aria-controls='".concat(d,"'][aria-haspopup='true'], *[aria-controls='").concat(d,"'][aria-expanded='true']")),m=["combobox","listbox","menu","menubar","radiogroup","tree","treegrid"];if(c&&r.CommonUtil.isTabbable(c)&&u&&u.length>0&&u.some((function(e){return m.includes(e)})))return null}for(var p=!0,h=l.ownerDocument,_=r.CommonUtil.hasAttribute,b=new Array,g="",f=!1,v=0;v<u.length;++v)if(o.ARIADefinitions.containers.includes(u[v])&&"true"!=(_(l,"aria-disabled")?l.getAttribute("aria-disabled"):"")&&!_(l,"aria-activedescendant")&&!r.CommonUtil.isTabbable(l)){var A=o.ARIADefinitions.designPatterns[u[v]].reqChildren;if(A){f=!0,p=!1;for(var y="descendant::*[",w=0;w<A.length;w++)y+="@role='"+A[w]+"' or ";y=y.substring(0,y.length-4)+"]";for(var k=h.evaluate(y,l,r.CommonUtil.defaultNSResolver,0,null),C=k.iterateNext();C&&!p;)if(r.CommonUtil.shouldNodeBeSkippedHidden(C))C=k.iterateNext();else{if(!(p=r.CommonUtil.isTabbable(C)))for(var x=h.evaluate("descendant::*",C,r.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P&&!p;)r.CommonUtil.shouldNodeBeSkippedHidden(P)||(p=r.CommonUtil.isTabbable(C)),P=x.iterateNext();p||(b=C.getAttribute("role").trim().split(" "),g=C.nodeName.toLowerCase()),C=k.iterateNext()}}}var R=new Array,T=new Array;return g.length>0&&b.length>0?(R.push(g),T.push(b.join(", "))):p=!0,f?p?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[R.toString(),T.toString()]):null}}}},4193:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&!n.AriaUtil.containsPresentationalChildrenOnly(l)){var s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length||(s=n.AriaUtil.getImplicitRole(l)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some((function(e){return u.includes(e)})))return null;if(s.includes("combobox"))return null;var d=n.AriaUtil.getRequiredChildRoles(l,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=n.AriaUtil.getDirectATChildren(l);if(!m||0==m.length){var p=l.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,_=0;_<m.length;_++){var b=n.AriaUtil.getRoles(m[_],!1);b&&0!=b.length||(b=n.AriaUtil.getImplicitRole(m[_])),b&&b.length>0&&(b.some((function(e){return d.includes(e)}))||h.push(b.join(", ")))}if(h.length>0){for(var g=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),g.push((0,a.RuleFail)("Fail_invalid_child",v))}return g}return(0,a.RulePass)("Pass")}}}},3188:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_unique.html",Fail_1:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"complementary",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_complementary_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_complementary_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},4176:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"complementary")?r.CommonUtil.attributeNonEmpty(l,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},7964:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(4377),l=i(4377),n=i(1421),r=i(8656);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.AccNameUtil.computeAccessibleName(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2554:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788),s=i(7440),u=i(8656),d=i(5755);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!l){(l={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<l.landmarks.value.length;++c)l.mapLandmarks[l.landmarks.value[c]]=!0;for(l.mapPossibleOrphanedWidgets={},c=0;c<l.possibleOrphanedWidgets.value.length;++c)l.mapPossibleOrphanedWidgets[l.possibleOrphanedWidgets.value[c]]=!0;for(l.mapPossibleOrphanedElements={},c=0;c<l.possibleOrphanedElements.value.length;++c)l.mapPossibleOrphanedElements[l.possibleOrphanedElements.value[c]]=!0;for(l.mapNoLandmarkedRoles={},c=0;c<l.noLandmarkedRoles.value.length;++c)l.mapNoLandmarkedRoles[l.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",l)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!r.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,_=n.AriaUtil.hasRole(m,l.mapPossibleOrphanedWidgets,!0);"link"===p&&(_=!1);var b=p in l.mapPossibleOrphanedElements;if(!_&&!b)return null;if(!(h=i.aria.map((function(e){return e.role})).filter((function(e){return e in l.mapLandmarks})).length>0)){for(var g=s.DOMWalker.parentElement(m);!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=s.DOMWalker.parentElement(g);for(g=m.nextElementSibling;!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=g.nextElementSibling;for(g=m.previousElementSibling;!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=g.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||n.AriaUtil.hasRole(m,l.mapNoLandmarkedRoles,!0)||n.AriaUtil.getAncestorWithRole(m,l.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},1229:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_label_unique.html",Fail_1:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"contentinfo",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_contentinfo_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_contentinfo_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},8523:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"contentinfo")?r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},3781:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"contentinfo")?n.AriaUtil.getSiblingWithRoleHidden(l,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},8509:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["307n5z"],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&n.AriaUtil.containsPresentationalChildrenOnly(l)){var s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length||(s=n.AriaUtil.getImplicitRole(l)),!s||0===s.length)return null;l.tagName.toLowerCase();var u=n.AriaUtil.getDirectATChildren(l);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=0;m<u.length;m++){var p=u[m].nodeName.toLowerCase();if("img"!==p&&"svg"!==p){var h=n.AriaUtil.getRoles(u[m],!1);h&&h.length>0?d.push(h.join(", ")):(h=n.AriaUtil.getImplicitRole(u[m]))&&h.length>0&&c.push(h.join(", "))}}if(d.length>0){for(var _=[],b=0;b<d.length;b++)(g=new Array).push(s.join(", ")),g.push(d[b]),_.push((0,a.RuleFail)("fail_child_explicit_role",g));return _}if(c.length>0){for(_=[],b=0;b<c.length;b++){var g;(g=new Array).push(s.join(", ")),g.push(c[b]),_.push((0,a.RulePotential)("potential_child_implicit_role",g))}return _}}}}},3234:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_document_label_unique.html",Fail_1:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"document",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_document_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_document_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""===d||!(d in u)||u[d]<=1?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},5217:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.getAncestor(l,"svg"))return null;if(n.AriaUtil.hasAnyRole(l,!0))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.isfocusableByDefault(l))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(l.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)l.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},4050:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_form_label_unique.html",Fail_1:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("form"===l.getAttribute("role")||l.hasAttribute("aria-label")||l.hasAttribute("aria-labelledby")||l.hasAttribute("title")){var s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"form",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_form_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_form_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}return null}}},4275:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(4377),l=i(490),n=i(8137),r=i(8656);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=l.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&n.CommonUtil.hasInnerContent(u)}return s||(s=n.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},1465:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(8137),l=i(4377),n=i(4377);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase();return a.CommonUtil.isTabbable(n)?(0,l.RuleFail)("Fail_1",[r]):(0,l.RulePass)("Pass_0")}}},405:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(482),s=i(8235),u=i(8656);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var l=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(l)),p=l.attributes,h=new Array,_=0;if(p)for(var b=0,g=p.length;b<g;b++){d=!0;var f=p[b].name;if(n.AriaUtil.isDefinedAriaAttribute(l,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){_++;var y=r.CommonUtil.normalizeSpacing(p[b].nodeValue).length,w=p[b].nodeValue.split(" ");if(y<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&y>=1&&w.length>1){d=!1;for(var k=0,C=w.length;k<C;++k)""!=w[k]&&h.push(w[k])}if(d&&y>=1)for(var x=0,P=w.length;x<P;++x)if(w[x].length>0){var R=m.getElementById(w[x]);if((d=null!=R)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(R)),d)break;""!=w[x]&&h.push(w[x])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,L=new Array;return T||(I.push(c.join(", ")),L.push(l.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==_?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),L.toString()])}}},9136:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(4377),l=i(490),n=i(8137),r=i(8656);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=l.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&n.CommonUtil.hasInnerContent(d)}return u||(u=n.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},5117:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235),s=i(8656);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)){var u=!0,d=u,c=l.ownerDocument,m=o.ARIADefinitions.designPatterns,p=n.AriaUtil.getRoles(l,!1);if("datalist"===l.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],_=0,b=h;_<b.length;_++){var g=b[_];if(null!=n.AriaUtil.getAncestorWithRole(l,g,!0))return null}for(var f=r.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(l,"aria-disabled")&&l.getAttribute("aria-disabled")||(u=l.hasAttribute("onkeydown")||l.hasAttribute("onkeypress")||l.hasAttribute("onkeyup"))))if(f(l,"aria-activedescendant"))u=!0;else{var y,w=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(w)for(var k=0,C=w.length;k<C;k++)for(var x="*[contains(@role,'"+w[k]+"')]",P=c.evaluate(x,l,r.CommonUtil.defaultNSResolver,0,null),R=P.iterateNext();R;){if(!(u=R.hasAttribute("onkeydown")||R.hasAttribute("onkeypress")))for(var T="descendant::*",U=(y=c.evaluate(T,R,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)r.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=y.iterateNext();if(!u)break;R=P.iterateNext()}else for(T="descendant::*",U=(y=c.evaluate(T,l,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(r.CommonUtil.shouldNodeBeSkippedHidden(U))U=y.iterateNext();else{var I;(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=y.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var L=new Array;L.push(l.nodeName.toLowerCase());var E=new Array;E.push(v.join(", "));var W=l.getAttribute("id");return W&&W.trim().length>0&&l.ownerDocument.querySelector("*[aria-controls='".concat(W,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[L.toString(),E.toString()])}}}},9062:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(4377),l=i(4377),n=i(4944),r=i(295),o=i(482),s=i(7788),u=i(1421);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"Pass_0",Fail_0:"Fail_0"}},help:{"en-US":{Pass_0:"aria_landmark_name_unique.html",Fail_0:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{Pass_0:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",Fail_0:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){for(var l=e.dom.node,d=l,c=[];d;)c.unshift(d),d=d.parentElement;c.forEach((function(e){if(null!==e&&("DIALOG"==e.tagName||"dialog"==e.getAttribute("role")))return null}));var m=o.FragmentUtil.getOwnerFragment(l),p=s.CacheUtil.getCache(l.ownerDocument,"aria_landmark_name_unique",null);if(!p){p={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var h=m.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),_=Array.from(h),b=[],g=[],f=[],v=0;v<_.length;v++){for(var A=_[v],y=!1;A;)null!==(A=A.parentElement)&&("DIALOG"!=A.tagName&&"dialog"!=A.getAttribute("role")||(y=!0));y||f.push(_[v])}for(_=f,v=0;v<_.length;v++){var w=[];for(A=_[v].parentElement;A;)w.push(A),A=A.parentElement;for(var k=0;k<w.length;k++){var C=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[k].tagName),x=!1;if(w[k].hasAttribute("role")&&(x=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[k].getAttribute("role"))),C||x){b.push(w[k]);break}if(k===w.length-1){b.push(null);break}}}var P=[];for(v=0;v<_.length;v++){var R=u.AccNameUtil.computeAccessibleName(_[v]);P.push(R&&R.name&&R.name.trim().length>0?R.name.trim():"")}for(v=0;v<b.length;v++){var T=!1,U=!1;for(k=0;k<b.length;k++)if(k!==v){if(null===b[v]&&null===b[k]){if(n.ARIAMapper.nodeToRole(_[v])===n.ARIAMapper.nodeToRole(_[k])){if(P[v]===P[k]){g.push("Fail_0"),T=!0;break}U=!0}}else if(null===b[v]||null===b[k])continue;if(r.DOMUtil.sameNode(b[v],b[k])&&n.ARIAMapper.nodeToRole(_[v])===n.ARIAMapper.nodeToRole(_[k])){if(P[v]===P[k]){g.push("Fail_0"),T=!0;break}U=!0}}T||(U?g.push("Pass_0"):g.push("null"))}p.navigationNodesComputedLabels=P,p.navigationNodes=_,p.navigationNodesParents=b,p.navigationNodesMatchFound=g,s.CacheUtil.setCache(l.ownerDocument,"aria_landmark_name_unique",p)}var I=-1;for(v=0;v<p.navigationNodes.length;v++)l.isSameNode(p.navigationNodes[v])&&(I=v);return-1===I?null:"Pass_0"===p.navigationNodesMatchFound[I]?(0,a.RulePass)("Pass_0",[n.ARIAMapper.nodeToRole(p.navigationNodes[I])]):"Fail_0"===p.navigationNodesMatchFound[I]?(0,a.RuleFail)("Fail_0",[n.ARIAMapper.nodeToRole(p.navigationNodes[I]),p.navigationNodesComputedLabels[I]]):null}}},5746:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){for(var l=e.dom.node,o=n.AriaUtil.getAriaLabel(l),s=n.AriaUtil.getAncestorWithRole(l,"document",!0),u=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0),d=null,c=0;c<u.length;++c)if(u[c]!==l&&(d=(0,a.RulePass)("Pass_0"),n.AriaUtil.getAncestorWithRole(u[c],"document",!0)===s&&n.AriaUtil.getAriaLabel(u[c])===o)){d=(0,a.RuleFail)("Fail_1");break}return d}}},8685:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0);return 0===o.length||1===o.length?null:n.AriaUtil.hasUniqueAriaLabelledby(o)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2678:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_navigation_label_unique.html",Fail_1:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"navigation",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_navigation_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_navigation_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},971:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(4377),l=i(4377),n=i(8235),r=i(490),o=i(8137),s=i(8656);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var l=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(l)||o.CommonUtil.isNodeDisabled(l)||r.AriaUtil.shouldBePresentationalChild(l)||s.VisUtil.isNodePresentational(l))){for(var u=!0,d=n.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map((function(e){return e.role})),_=h[h.length-2],b=2;"none"===_;)b++,_=h[h.length-b];var g=r.AriaUtil.getResolvedRole(l);if(d[g]&&null!=d[g].container){p++,u=!1;for(var f=0,v=(m=d[g].container).length;!u&&f<v&&!(u=_===m[f]);f++);0==u&&c.push(g)}var A=new Array;A.push(c.join(", "));var y=new Array;return y.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),y.toString()])}}}},3709:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_label_unique.html",Fail_1:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("region"===l.getAttribute("role")||l.hasAttribute("aria-label")||l.hasAttribute("aria-labelledby")&&!r.CommonUtil.isIdReferToSelf(l,l.getAttribute("aria-labelledby"))||l.hasAttribute("title")){var s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"region",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_region_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_region_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}return null}}},6486:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(l)?null:n.AriaUtil.hasAriaLabel(l)||r.CommonUtil.attributeNonEmpty(l,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4151:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(4377),l=i(4377),n=i(490);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var l=e.dom.node,r=l.getAttribute("role").trim().toLowerCase();if(0===r.length)return null;if(l.hasAttribute("aria-hidden")&&"true"===l.getAttribute("aria-hidden").toLowerCase())return null;var o=n.AriaUtil.getRolesUndefinedByAria(l);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=r.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},8545:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(5755);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.tagName.toLowerCase(),s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length){if(!n.AriaUtil.areRolesDefined(s))return null;if(["td","th","tr"].includes(o)){var u=r.TableUtil.isTableDescendant(i);if(null!==u&&u.length>0)return null}var d=n.AriaUtil.getImplicitRole(l);if(!d||0===d.length)return(0,a.RulePass)("pass");for(var c=[],m=0;m<s.length;m++)d.includes(s[m])?c.push((0,a.RuleFail)("fail_redundant",[s[m],o])):c.push((0,a.RulePass)("pass"));return c.length>0?c:null}}}},8538:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_search_label_unique.html",Fail_1:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"search",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_search_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_search_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},1908:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.tagName.toLowerCase();if(1!==l.nodeType)return null;var s=n.AriaUtil.getRolesUndefinedByAria(l);if(s&&s.length>0)return null;var u=n.AriaUtil.getDeprecatedAriaRoles(l);if(u&&u.length>0)return null;var d=n.AriaUtil.getDeprecatedAriaAttributes(l);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=r.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=n.AriaUtil.getUserDefinedRoles(l);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=n.AriaUtil.getInvalidRoles(l);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&r.CommonUtil.isTabbable(l)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(1!==l.nodeType)return null;var r=n.AriaUtil.getUserDefinedAriaAttributes(l);if(null===r||0===r.length)return null;var o=n.AriaUtil.getUserDefinedRoles(l),s=!0;if(o&&o.length>0){if(!n.AriaUtil.areRolesDefined(o))return null}else o=n.AriaUtil.getImplicitRole(l),s=!1;var u=l.tagName.toLowerCase(),d=n.AriaUtil.getInvalidAriaAttributes(l);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[r.join(", "),u,o.join(", ")])}}},6360:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_toolbar_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_toolbar_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},5386:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(4944),s=i(482),u=i(8235),d=i(295);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var l=e.dom.node;if(l.hasAttribute("type")&&"hidden"===l.getAttribute("type")||n.AriaUtil.getAncestorWithRole(l,"combobox")&&!n.AriaUtil.hasRoleInSemantics(l,"textbox")&&!n.AriaUtil.hasRoleInSemantics(l,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(l),m=l.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&l.getAttribute("type"),!l.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(l.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(n.AriaUtil.hasRoleInSemantics(l,p[h]))for(var _=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"combobox",!0,!0),b=0;b<_.length;b++){var g=_[b],f=r.CommonUtil.getElementAttribute(g,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(l,v[A])===l)return null}for(var y=!0,w=u.ARIADefinitions.designPatterns,k=n.AriaUtil.getRoles(l,!0),C=0,x=["widget","liveRegion","window"],P=(A=0,k.length);y&&A<P;++A){var R=w[k[A]];R&&R.nameRequired&&R.roleType&&x.includes(R.roleType)&&(++C,!(y=n.AriaUtil.hasAriaLabel(l)||r.CommonUtil.attributeNonEmpty(l,"title")||r.CommonUtil.getLabelForElementHidden(l,!0))&&R.nameFrom&&R.nameFrom.indexOf("contents")>=0&&(y=r.CommonUtil.hasInnerContentOrAlt(l)),y||(y=r.CommonUtil.hasImplicitLabel(l)),y||"img"!==l.tagName.toLowerCase()||l.hasAttribute("role")||!l.hasAttribute("alt")||(y=d.DOMUtil.cleanWhitespace(l.getAttribute("alt")).trim().length>0),R.nameFrom.indexOf("prohibited"))}return 0===C?null:y?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},8752:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(4377),l=i(8137);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if("pre"==n.nodeName.toLowerCase()&&(n.previousSibling&&"code"==n.previousSibling.nodeName.toLowerCase()||n.getElementsByTagName("code").length>0||l.CommonUtil.getAncestor(n,"code")))return(0,a.RulePass)("Pass_0");for(var r=!0,o=l.CommonUtil.getInnerText(n),s=0,u=0,d="",c=0;r&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},4392:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(4377),l=i(4377),n=i(8137);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getInnerText(l);l.hasAttribute("style")&&(r=l.getAttribute("style"));var o=-1==r.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},932:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(4377),l=i(4377);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},6255:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(4377),l=i(4377),n=i(8137);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"cite");if(!r){var o=n.CommonUtil.getDocElementsByTag(l,"cite");r=null!=o&&o.length>0}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5743:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(4377),l=i(4377),n=i(8656);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.innerHTML.trim().length>0;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RuleManual)("Manual_1")}}},2671:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(4377),l=i(4377);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!1;if("true"===l.getAttribute("aria-hidden"))return null;for(var r=l.getElementsByTagName("track"),o=0;o<r.length;++o)n=n||"captions"===r[o].getAttribute("kind");if(l.textTracks&&l.textTracks.length>0)for(o=0;o<l.textTracks.length;o++)n=n||"captions"===l.textTracks[o].kind;return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},3974:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(482),o=i(7440),s=i(7788),u=i(8656);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,d=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=l.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var _=r.FragmentUtil.getById(l,h);if(!_)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var g=new o.DOMWalker(m);!b&&g.nextNode()&&g.node!=m&&g.node!=m.nextSibling;)1===g.node.nodeType&&u.VisUtil.isNodeVisible(g.node)&&(b=g.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=n.AriaUtil.getRoles(_,!0);return 0===["option","gridcell","row","treeitem"].filter((function(e){return v.includes(e)})).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==_.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},9881:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(7788),o=i(8656);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===l.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new n.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},1226:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656),s=i(7788);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;var u,d="select"===(u=l).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=l.tagName.toLowerCase(),m="true"===(n.AriaUtil.getAriaAttribute(l,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!l.hasAttribute("type")||"text"===l.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var _=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});return _?(_[h]={inputElement:p?l:null,pattern:d,expanded:m},s.CacheUtil.setCache(l.ownerDocument,"combobox",_),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},7369:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(490),o=i(8137),s=i(7788),u=i(8656);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,d=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=r.AriaUtil.getRoles(m,!0)[0],_=[];if(o.CommonUtil.isTabbable(l)||_.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!r.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var g=new n.DOMWalker(m);b&&g.nextNode()&&(1!==g.node.nodeType||!u.VisUtil.isNodeVisible(g.node)||(b=!o.CommonUtil.isTabbable(g.node)&&!r.AriaUtil.getAriaAttribute(g.node,"aria-activedescendant"),!g.bEndTag||g.node!==m.lastElementChild)););return b||_.push((0,a.RuleFail)("Fail_tabbable_child")),0===_.length?(0,a.RulePass)("Pass"):_}}},2633:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(7788);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=n.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter((function(e){return c.includes(e)}));if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=l.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!l.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},2429:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(4377),l=i(4377),n=i(482),r=i(7788),o=i(8656);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var l=e.dom.node,s=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!l.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=l.getAttribute("aria-owns"),!(c=n.FragmentUtil.getById(l,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!l.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=l.getAttribute("aria-controls"),!(c=n.FragmentUtil.getById(l,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},7874:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(4377);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},3334:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(8137),l=i(4377),n=i(4377);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:n.eRulePolicy.INFORMATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(!a.CommonUtil.isTabbable(n))return null;var r=i.aria[i.aria.length-1];return(0,l.RulePass)("Pass_0",[],[{name:r.attributes.name,role:r.role,tabindex:parseInt(n.getAttribute("tabindex")||"0")}])}}},4298:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(4377),l=i(4377);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==l||"rtl"==l||"auto"==l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4435:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=l.getAttribute("href"),s=n.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},1685:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(8656);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;var o=n.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(n,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===n.getAttribute("draggable")?(0,l.RulePotential)("potential_alternative",[o]):"false"===n.getAttribute("draggable")?(0,l.RulePass)("pass_undraggable",[o]):null}}},6313:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656),s=i(8235),u=i(1421);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeVisible(l)&&!r.CommonUtil.isNodeDisabled(l)&&!r.CommonUtil.isTabbable(l)){var d=n.AriaUtil.getRoles(l,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!l.parentElement||"fieldset"!==l.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(l);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},9109:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(4377),l=i(4377),n=i(7788);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CacheUtil.getCache(l.ownerDocument,"element_accesskey_unique",{}),o=l.getAttribute("accesskey"),s=!(o in r);return r[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},9918:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(4377),l=i(4377),n=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],r=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("tbody"===l.nodeName.toLowerCase()&&l.hasAttribute("align"))return(0,a.RulePass)("pass");if(l.nodeName.includes("-"))return null;var s=l.nodeName.toLowerCase();if(n.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=l.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];r.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,_=u;h<_.length;h++)p=_[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},8105:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(4377),l=i(4377),n=i(482);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{group:"element_id_unique.html",Pass_0:"element_id_unique.html",Fail_1:"element_id_unique.html",Fail_2:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",Pass_0:"Rule Passed",Fail_1:'The <{0}> element has the id "{1}" that is empty',Fail_2:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail"}}],run:function(e,t,i){var l=e.dom.node,r=l.getAttribute("id");return""===r?(0,a.RuleFail)("Fail_1",[l.nodeName.toLowerCase(),r]):n.FragmentUtil.getById(l,r)===l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[l.nodeName.toLowerCase(),r])}}},8687:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(4377),l=i(4377),n=i(2527),r=i(8656),o=i(7440),s=i(1421),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!n.LangUtil.validPrimaryLang(a))return 1;if(!n.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!n.LangUtil.validPrimaryLang(a))return 3;if(!n.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var l=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][l]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var l=e.dom.node;if("html"===l.nodeName.toLowerCase())return null;var n=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==l.firstChild)for(var m=new o.DOMWalker(l,!1,l,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!r.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},2150:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(4377),l=i(4377);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,n=l.nodeName.toLowerCase(),r=l.hasAttribute("href")||!l.hasAttribute("ondblclick")&&!l.hasAttribute("onmousemove")&&(!l.hasAttribute("onmousedown")||l.hasAttribute("onkeydown"))&&(!l.hasAttribute("onmouseup")||l.hasAttribute("onkeyup"))&&(!l.hasAttribute("onmouseover")||l.hasAttribute("onfocus"))&&(!l.hasAttribute("onmouseout")||l.hasAttribute("onblur"))&&(!l.hasAttribute("onclick")||l.hasAttribute("onkeypress")||"a"==n||"button"==n),o=new Array;return r||(l.hasAttribute("ondblclick")&&o.push("ondblclick"),l.hasAttribute("onmousemove")&&o.push("onmousemove"),l.hasAttribute("onmousedown")&&!l.hasAttribute("onkeydown")&&o.push("onmousedown"),l.hasAttribute("onmouseup")&&!l.hasAttribute("onkeyup")&&o.push("onmouseup"),l.hasAttribute("onmouseover")&&!l.hasAttribute("onfocus")&&o.push("onmouseover"),l.hasAttribute("onmouseout")&&!l.hasAttribute("onblur")&&o.push("onmouseout"),l.hasAttribute("onclick")&&!l.hasAttribute("onkeypress")&&"a"!=n&&"button"!=n&&o.push("onclick")),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[n,o.join(", ")])}}},4557:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(4377),l=i(4377),n=i(1775),r=i(8656),o=i(7788),s=i(482),u=i(8137);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;if(u.CommonUtil.getAncestor(l,["script","meta","title"]))return null;var d=l.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(l),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=n.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach((function(e){Object.keys(m[e]).forEach((function(t){Object.keys(m[e][t]).length>0&&n.CSSUtil.selectorMatchesElem(l,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))}))})),0===p.length)return null;for(var h=[],_=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var r=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach((function(e){t.includes(e)&&(r=!0)})),!r)return"continue";var o=n.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=n.CSSUtil.getDefinedStyles(l);s.transform&&(o+=n.CSSUtil.getRotationDegree(s.transform)),Math.abs(o-360)%360>1?h.push((0,a.RuleFail)("fail_locked",[d])):h.push((0,a.RulePass)("pass"))},b=0;b<p.length;b++)_(b);return h.length>0?h:null}}},4721:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(8656),o=i(1775);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["0ssw9k"],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeVisible(n)&&!a.CommonUtil.isNodeDisabled(n)){if(a.CommonUtil.getAncestor(n,["iframe","svg","script","meta"]))return null;if(!a.CommonUtil.hasInnerContent(n))return null;var s=n.nodeName.toLowerCase(),u=getComputedStyle(n);if(!("visible"!==u.overflowX&&"hidden"!==u.overflowX||"visible"!==u.overflowY&&"hidden"!==u.overflowY))return null;if(Math.max(n.offsetWidth,n.offsetHeight)<30||Math.min(n.offsetWidth,n.offsetHeight)<15)return null;var d=o.CSSUtil.getPixelsFromStyle(u.paddingLeft,n)+o.CSSUtil.getPixelsFromStyle(u.paddingRight,n),c=o.CSSUtil.getPixelsFromStyle(u.paddingTop,n)+o.CSSUtil.getPixelsFromStyle(u.paddingBottom,n);return n.scrollWidth-n.clientWidth<1+d&&n.scrollHeight-n.clientHeight<1+c?null:a.CommonUtil.isTabbable(n)?(0,l.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(n)>0?(0,l.RulePass)("pass_interactive"):!n.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,l.RuleFail)("fail_scrollable",[s])}}}},2814:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8235),s=i(1775),u=i(7440),d=i(8656);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.isNodeDisabled(l)||d.VisUtil.isNodeHiddenFromAT(l))return null;var c=l.nodeName.toLowerCase();if(c in r.CommonUtil.tabTagMap){var m=r.CommonUtil.tabTagMap[c];if("function"==typeof m&&(m=m(l)),m)return null}if(!l.hasAttribute("tabindex")||parseInt(l.getAttribute("tabindex"))<0)return null;var p=s.CSSUtil.getDefinedStyles(l);if("scroll"===p["overflow-x"]||"scroll"===p["overflow-y"]||"auto"===p["overflow-x"]||"auto"===p["overflow-y"])return null;var h=u.DOMWalker.parentNode(l),_=n.AriaUtil.getResolvedRole(h);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(_))return null;var b=n.AriaUtil.getResolvedRole(l);return b?"application"===b?null:"row"===b||"separator"===b||"widget"===o.ARIADefinitions.designPatterns[b].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[b]):(0,a.RuleFail)("fail_no_valid_role")}}},9188:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(8656),o=i(5697);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n)||!a.CommonUtil.isTabbable(n))return null;var s=n.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(n,["pre","code","script","meta"])||"body"===s||"html"===s)return null;var u=new o.DOMMapper,d=u.getUnadjustedBounds(n);if(!d)return null;if(0===d.height||0===d.width)return null;var c=n.ownerDocument;if(!c)return null;var m=c.defaultView;if(!m)return null;var p=m.getComputedStyle(n);if(null===p)return null;var h=p.zIndex;h&&"auto"!==h||(h="0");var _=c.querySelectorAll("body *:not(script)");if(_&&0!=_.length){var b=[],g=!0;return _.forEach((function(e){if(n.contains(e))g=!1;else if(r.VisUtil.isNodeVisible(e)&&!e.contains(n)){var t=u.getUnadjustedBounds(e),i=m.getComputedStyle(e),a="0";i&&((a=i.zIndex)&&!isNaN(Number(a))||(a="0")),0!==t.height&&0!==t.width&&t.top<=d.top&&t.left<=d.left&&t.top+t.height>=d.top+d.height&&t.left+t.height>=d.left+d.width&&(g?parseInt(h)<parseInt(a):parseInt(h)<=parseInt(a))&&b.push(e)}})),b.length>0?(0,l.RulePotential)("potential_obscured",[]):(0,l.RulePass)("pass")}}}},7601:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(8137),l=i(1775),n=i(4377),r=i(4377),o=i(5697);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var s=r.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(r);if(!u)return null;var d=l.CSSUtil.getDefinedStyles(r),c=l.CSSUtil.getDefinedStyles(r,":focus");if(0===u.height||0===u.width)return(0,n.RulePotential)("potential_visible",[]);if("absolute"===d.position&&d.clip&&"rect(0px,0px,0px,0px)"===d.clip.replaceAll(" ","")&&!c.clip){if("input"===s&&("checkbox"===r.getAttribute("type")||"radio"===r.getAttribute("type"))){var m=a.CommonUtil.getLabelForElement(r);if(m&&!a.CommonUtil.isInnerTextEmpty(m)){var p=l.CSSUtil.getDefinedStyles(r,":focus"),h=l.CSSUtil.getDefinedStyles(r,":focus-visible"),_=l.CSSUtil.getDefinedStyles(r,":focus-within"),b=l.CSSUtil.getDefinedStyles(r,":checked");if(p||h||_||b)return(0,n.RulePass)("pass")}}return(0,n.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,n.RulePass)("pass");var g=getComputedStyle(r),f=u.top,v=u.left;if(0===Object.keys(c).length)return(0,n.RulePotential)("potential_visible",[]);var A=["absolute","fixed"];return void 0!==c.top&&(f=A.includes(c.position)||void 0===c.position&&A.includes(g.position)?c.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==c.left&&(v=A.includes(c.position)||void 0===c.position&&A.includes(g.position)?c.left.replace(/\D/g,""):Number.MIN_VALUE),f>=0&&v>=0?(0,n.RulePass)("pass"):(0,n.RulePotential)("potential_visible",[])}}},4497:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.CommonUtil.attributeNonEmpty(l,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},152:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.embed_noembed_exists=void 0;var a=i(4377),l=i(4377);t.embed_noembed_exists={id:"embed_noembed_exists",context:"dom:embed",refactor:{WCAG20_Embed_HasNoEmbed:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_noembed_exists.html",Potential_1:"embed_noembed_exists.html",group:"embed_noembed_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element is immediately followed by a non-embedded element",group:"<embed> elements should be immediately followed by a non-embedded element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node,n=l.getElementsByTagName("noembed").length>0;if(!n)for(var r=l.nextSibling;!n&&null!==r;){if("noembed"==r.nodeName.toLowerCase())n=!0;else{if("#text"==r.nodeName.toLowerCase()&&r.nodeValue.trim().length>0)break;if(1==r.nodeType)break}r=r.nextSibling}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},935:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(4377),l=i(8137);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var n=e.dom.node,r=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=n.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<r.length;++d)for(var c=s.indexOf(r[d]),m=r[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==r[d]||"(:"==r[d])&&/\(\:.*\:\)/.test(s))||(";)"==r[d]||"(;"==r[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(r[d],c+1);if(!o){var p=l.CommonUtil.getAncestor(n,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},9719:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(482),o=i(8656);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=n.AriaUtil.getAriaAttribute(l,"aria-errormessage");if(!s)return null;var u=r.FragmentUtil.getById(l,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},5625:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(4377),l=i(4377),n=i(482),r=i(7788),o=i(8137),s=i(8656),u=i(1421);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)&&!o.CommonUtil.isNodeDisabled(l)){var d=n.FragmentUtil.getOwnerFragment(l),c=r.CacheUtil.getCache(l.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],_=0;_<p.length;_++)p[_].querySelector("input")&&h.push(p[_]);var b=[];for(_=0;_<h.length;_++){var g=u.AccNameUtil.computeAccessibleName(h[_]);b.push(g&&g.name&&g.name.trim().length>0?g.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,r.CacheUtil.setCache(l.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(_=0;_<c.groupsWithInputs.length;_++)if(l.isSameNode(c.groupsWithInputs[_])){if(f=!0,""===c.groupsWithInputsComputedLabels[_]||null===c.groupsWithInputsComputedLabels[_])return(0,a.RuleFail)("Fail_1");for(var A=!1,y=0;y<c.groupsWithInputsComputedLabels.length;y++)_!=y&&c.groupsWithInputsComputedLabels[_]===c.groupsWithInputsComputedLabels[y]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[_]]);v=c.groupsWithInputsComputedLabels[_]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},9115:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l)||n.CommonUtil.isNodeDisabled(l))return null;var o=n.CommonUtil.getChildByTagHidden(l,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===n.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},6072:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(4377),l=i(4377),n=i(8656),r=i(1421);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(l.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},6923:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(4377),l=i(4377);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=!0,n=e.dom.node.getElementsByTagName("font");if(null!=n)for(var r=0;r<n.length;++r)l=!n[r].hasAttribute("color");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},9015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(4377),l=i(4377),n=i(8137);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l={paramWinText:{value:["new window"],type:"array"}},r=e.dom.node,o=r.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=n.CommonUtil.getFrameByName(r,o);if(!s){var u=n.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(u+=" "+r.getAttribute("title"));for(var d=0;!s&&d<l.paramWinText.value.length;++d)-1!=u.indexOf(l.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},3611:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(4377),l=i(4377),n=i(482),r=i(7788);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CacheUtil.getCache(n.FragmentUtil.getOwnerFragment(l),"RPT_Label_Single",{}),s=l.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4846:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(7440);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=!1;if(l.firstChild)for(var s=new r.DOMWalker(l,!0);!o&&s.prevNode()&&s.node!=l;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=n.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3277:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(4377);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var l=0===e.dom.node.getAttribute("onchange").trim().length;return l?null:l?void 0:(0,a.RulePotential)("Potential_1")}}},4525:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"src")&&n.CommonUtil.isHtmlExt(n.CommonUtil.getFileExt(l.getAttribute("src")));return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7114:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(4377),l=i(4377),n=i(1421),r=i(8656);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;if(l.getAttribute("role"))return null;var o=n.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3751:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(4377),l=i(4377),n=i(8137);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.CommonUtil.hasInnerContentHidden(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7084:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(4377),l=i(4377),n=i(8137);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.wordCount(n.CommonUtil.getInnerText(l))<=20;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3981:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(4377),l=i(4377),n=i(9193),r=i(2527);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(n.AncestorUtil.isPresentationFrame(i))return null;var l=e.dom.node,o=l.ownerDocument.doctype?l.ownerDocument.doctype.publicId:"";o||(o="");var s=l.getAttribute("lang"),u=l.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},9788:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(482);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=!1,s=n.CommonUtil.getDocElementsByTag(l,"frame"),u=n.CommonUtil.getDocElementsByTag(l,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=n.CommonUtil.getDocElementsByTag(l,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,_="";if((h=void 0!==l.ownerDocument.locationFromDAP&&null!=l.ownerDocument.locationFromDAP?l.ownerDocument.locationFromDAP:l.ownerDocument.location)&&(_=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),_.startsWith("file:///")&&(_="file:/"+_.substring(8)),"#"==p.charAt(0)||p.startsWith(_+"#")){var b=n.CommonUtil.getFileAnchor(p);null!=r.FragmentUtil.getById(l,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var g=d[m].getAttribute("name");-1!=g.indexOf("#")&&(g=n.CommonUtil.getFileAnchor(g)),o=g in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4419:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(8656),o=i(5697);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeHiddenFromAT(n)&&!a.CommonUtil.isNodeDisabled(n)){var s=(new o.DOMMapper).getUnadjustedBounds(n);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))>=0)return(0,l.RulePass)("pass");var u=n;return u&&u.contentDocument&&u.contentDocument.documentElement&&a.CommonUtil.getTabbableChildren(n)>0?(0,l.RuleFail)("fail_invalid"):null}}}},2575:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var l=e.dom.node;return l.hasAttribute("type")&&"image"==l.getAttribute("type").toLowerCase()?r.CommonUtil.attributeNonEmpty(l,"alt")?(0,a.RulePass)("Pass_0"):n.AriaUtil.hasAriaLabel(l)?(0,a.RulePass)("Pass_1"):l.hasAttribute("title")&&l.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},8124:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.CommonUtil.attributeNonEmpty(l,"alt")||!l.hasAttribute("ismap")&&!n.CommonUtil.attributeNonEmpty(l,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3440:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(4377),l=i(4377),n=i(8656);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.ownerDocument.defaultView.getComputedStyle(l);if(null==r)return(0,a.RulePass)("Pass_0");var o=r.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=l.innerHTML&&0!=l.innerHTML.trim().length)s=!1;else{var u=l.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},2193:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8656);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=!0;return(n.AriaUtil.hasRole(l,"presentation")||n.AriaUtil.hasRole(l,"none"))&&(o=0==l.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},309:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(4377),l=i(4377),n=i(8656);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.nodeName.toLowerCase(),o=!0;if(l.hasAttribute("alt")){var s=l.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=l.getAttribute("area"==r?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},6281:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(4377),l=i(4377),n=i(8656),r=i(490),o=i(8137);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var l=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(l)||l.getAttribute("alt").trim().length>0?null:r.AriaUtil.getAriaLabel(l).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(l,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},7748:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(8137);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CommonUtil.getAncestor(l,"a");if(null==o)return null;var s=l.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new n.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new n.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8856:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8656);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;if(0!==n.AriaUtil.getAriaLabel(l).trim().length)return(0,a.RulePass)("pass");var o=l.hasAttribute("alt")?l.getAttribute("alt"):null;if(null!==o)return 0===o.length||o.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var s=l.hasAttribute("title")?l.getAttribute("title"):null;if(null!==s&&0!==s.length)return 0===s.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===o){var u=n.AriaUtil.getResolvedRole(l,!1);return"presentation"===u||"none"===u?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===o.length?(0,a.RulePass)("pass"):void 0}}},7393:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=!1;if(l.hasAttribute("usemap")){var s=l.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=n.CommonUtil.getDocElementsByTag(l,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},9410:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=l.getAttribute("longdesc"),s=n.CommonUtil.getFileExt(o),u=0!=s.length&&n.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},8081:function(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var l=Object.getOwnPropertyDescriptor(t,i);l&&!("get"in l?!t.__esModule:l.writable||l.configurable)||(l={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,l)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),l=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),l(i(8980),t),l(i(3961),t),l(i(1445),t),l(i(876),t),l(i(2768),t),l(i(2533),t),l(i(7178),t),l(i(9745),t),l(i(8019),t),l(i(6505),t),l(i(8910),t),l(i(3492),t),l(i(5316),t),l(i(8412),t),l(i(172),t),l(i(9844),t),l(i(9695),t),l(i(1699),t),l(i(4974),t),l(i(3054),t),l(i(4649),t),l(i(4193),t),l(i(3188),t),l(i(4176),t),l(i(7964),t),l(i(2554),t),l(i(1229),t),l(i(8523),t),l(i(3781),t),l(i(8509),t),l(i(3234),t),l(i(5217),t),l(i(4050),t),l(i(4275),t),l(i(1465),t),l(i(405),t),l(i(9136),t),l(i(5117),t),l(i(9062),t),l(i(5746),t),l(i(8685),t),l(i(2678),t),l(i(971),t),l(i(3709),t),l(i(6486),t),l(i(4151),t),l(i(8545),t),l(i(8538),t),l(i(1908),t),l(i(6360),t),l(i(5386),t),l(i(8752),t),l(i(4392),t),l(i(932),t),l(i(6255),t),l(i(5743),t),l(i(2671),t),l(i(3974),t),l(i(9881),t),l(i(1226),t),l(i(7369),t),l(i(2633),t),l(i(2429),t),l(i(7874),t),l(i(3334),t),l(i(4298),t),l(i(4435),t),l(i(1685),t),l(i(6313),t),l(i(9109),t),l(i(9918),t),l(i(8105),t),l(i(8687),t),l(i(2150),t),l(i(4557),t),l(i(4721),t),l(i(2814),t),l(i(9188),t),l(i(7601),t),l(i(4497),t),l(i(152),t),l(i(935),t),l(i(9719),t),l(i(5625),t),l(i(9115),t),l(i(6072),t),l(i(6923),t),l(i(9015),t),l(i(3611),t),l(i(4846),t),l(i(3277),t),l(i(4525),t),l(i(7114),t),l(i(3751),t),l(i(7084),t),l(i(3981),t),l(i(9788),t),l(i(4419),t),l(i(2575),t),l(i(8124),t),l(i(3440),t),l(i(2193),t),l(i(309),t),l(i(6281),t),l(i(7748),t),l(i(8856),t),l(i(7393),t),l(i(9410),t),l(i(8589),t),l(i(3366),t),l(i(8929),t),l(i(5403),t),l(i(5937),t),l(i(4452),t),l(i(7209),t),l(i(8262),t),l(i(7017),t),l(i(9980),t),l(i(7733),t),l(i(1256),t),l(i(9532),t),l(i(6698),t),l(i(9632),t),l(i(3692),t),l(i(5430),t),l(i(1018),t),l(i(3433),t),l(i(8012),t),l(i(3881),t),l(i(3106),t),l(i(1276),t),l(i(5424),t),l(i(4248),t),l(i(9526),t),l(i(9379),t),l(i(5495),t),l(i(7753),t),l(i(1252),t),l(i(3576),t),l(i(3617),t),l(i(6110),t),l(i(5681),t),l(i(1922),t),l(i(7906),t),l(i(5451),t),l(i(6349),t),l(i(5393),t),l(i(9887),t),l(i(5102),t),l(i(9977),t),l(i(8454),t),l(i(25),t),l(i(2884),t),l(i(5390),t),l(i(7196),t),l(i(9965),t),l(i(4468),t),l(i(4451),t),l(i(6087),t),l(i(5864),t),l(i(4066),t),l(i(2841),t),l(i(272),t),l(i(1348),t),l(i(6215),t),l(i(5275),t),l(i(7900),t),l(i(5027),t),l(i(3496),t),l(i(1131),t),l(i(8681),t),l(i(4577),t),l(i(8051),t)},8589:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l)||n.CommonUtil.isNodeDisabled(l))return null;var o=l.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=l.nodeName.toLowerCase();if(!s.every((function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)})))return(0,a.RuleFail)("fail_incorrect");var _=l.hasAttribute("type")?l.getAttribute("type").trim().toLowerCase():"text",b=[],g=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,g=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,_){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),g=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,g=u.tokensMandatoryGroup2_url;break;case"email":g=u.tokensMandatoryGroup2_email;break;case"tel":g=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,g.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},3366:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7440),s=i(7788),u=i(8656),d=i(5755);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(l))return null;var c=function(e){var t=r.CommonUtil.getAncestor(e,"fieldset")||n.AriaUtil.getAncestorWithRole(e,"radiogroup")||n.AriaUtil.getAncestorWithRole(e,"group")||n.AriaUtil.getAncestorWithRole(e,"grid")||n.AriaUtil.getAncestorWithRole(e,"table");return t||(t=r.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=l.getAttribute("type").toLowerCase(),p=n.AriaUtil.getAncestorWithRole(l,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var _=new o.DOMWalker(p,!1,p,!0),b=[],g=[];_.nextNode();)if(!_.bEndTag&&1===_.node.nodeType&&"input"===_.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(_.node)){var f=_.node.getAttribute("type");"checkbox"===f?b.push(_.node):"radio"===f&&g.push(_.node)}for(var v=0;v<b.length;++v){var A=b[v];if((n.AriaUtil.getAncestorWithRole(A,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(A)){var y=A.getAttribute("name")||"";(h.checkboxByName[y]=h.checkboxByName[y]||[]).push(A),h.nameToGroup[y]=h.nameToGroup[y]||c(A),++h.numCheckboxes}}for(v=0;v<g.length;++v){var w=g[v];if((n.AriaUtil.getAncestorWithRole(w,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(w)){var k=w.getAttribute("name")||"";(h.radiosByName[k]=h.radiosByName[k]||[]).push(w),h.nameToGroup[k]=h.nameToGroup[k]||c(w),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var C=l.getAttribute("name"),x=c(l);if(m="radio"===m?"Radio":"Checkbox",C&&""!==C){var P=(h.radiosByName[C]||[]).length,R=(h.checkboxByName[C]||[]).length;return P>0&&R>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",C]):"Radio"===m&&(1===h.numRadios||1===P)||"Checkbox"===m&&1===h.numCheckboxes?null===x?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===R?null===x?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===x?null!==h.nameToGroup[C]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,C]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,C]):h.nameToGroup[C]!==x?(0,a.RuleFail)("fail_notsamegroup",[m,C]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===x?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===x?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},8929:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(4377),l=i(4377),n=i(8137);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")&&"text"!=(m=l.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=n.CommonUtil.getAncestor(l,"fieldset"))return(0,a.RulePass)("Pass_0");for(var r=n.CommonUtil.getAncestor(l,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=r.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!n.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==l||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},5403:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(l)||r.CommonUtil.isNodeDisabled(l))return null;var s=n.AriaUtil.getUserDefinedRoles(l);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=l.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=l.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=l.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},5937:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(8137);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o="";if(l.hasAttribute("type")&&(o=l.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=r.CommonUtil.getLabelForElementHidden(l,!0);if(null===s||!r.CommonUtil.hasInnerContentHidden(s))return null;var u,d=r.CommonUtil.compareNodeOrder(s,l);if(-2===d){u=!1;var c=new n.DOMWalker(s);for(c.node=l;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},4452:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(4377),l=i(4377),n=i(8137);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")){var r=l.getAttribute("type").toLowerCase();if("text"!=r&&"file"!=r&&"password"!=r)return null}var o=n.CommonUtil.getLabelForElementHidden(l,!0);if(null==o||!n.CommonUtil.hasInnerContentHidden(o))return null;var s=n.CommonUtil.compareNodeOrder(o,l);if(-2===s){var u=n.CommonUtil.getInnerText(l);if(u&&u.trim().length>0&&n.CommonUtil.getInnerText(l).trim()===u.trim())return null;for(var d=!1,c=l.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},7209:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8656),o=i(1421);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var s=l.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&l.hasAttribute("type")?u=l.getAttribute("type").toLowerCase():("button"===s||n.AriaUtil.hasRoleInSemantics(l,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(l);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):l.hasAttribute("role")&&l.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",l.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},8262:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(482),s=i(8656),u=i(295),d=i(1421);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,c=l.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;if(r.CommonUtil.getAncestor(l,"table"))return null;if(n.AriaUtil.getAncestorWithRole(l,"combobox")&&!(n.AriaUtil.hasRoleInSemantics(l,"textbox")||n.AriaUtil.hasRoleInSemantics(l,"searchbox")||"input"===c||"select"===c&&n.AriaUtil.hasRoleInSemantics(l,"combobox")))return null;for(var m=["listbox","tree","grid","dialog"],p=0;p<m.length;p++)if(n.AriaUtil.hasRoleInSemantics(l,m[p]))for(var h=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"combobox",!0,!0),_=0;_<h.length;_++){var b=h[_],g=r.CommonUtil.getElementAttribute(b,"aria-owns");if(g)for(var f=r.CommonUtil.normalizeSpacing(g.trim()).split(" "),v=0;v<f.length;v++)if(o.FragmentUtil.getById(l,f[v])===l)return null}var A=d.AccNameUtil.computeAccessibleName(l);if(("input"===c||"button"===c)&&A&&A.name&&A.name.trim().length>0&&("label"===A.nameFrom||"internal"===A.nameFrom||"alt"===A.nameFrom))return(0,a.RulePass)("pass");var y=n.AriaUtil.getResolvedRole(l);if(y&&"button"===y&&"input"!==c&&"button"!==c&&!r.CommonUtil.getAncestor(l,"form"))return null;if(A&&A.name&&A.name.trim().length>0&&("text"===A.nameFrom||"title"===A.nameFrom))return(0,a.RulePass)("pass");var w=n.AriaUtil.getAllDescendantsWithRoles(l,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(w&&w.length>0)for(var k=0;k<w.length;k++)if(r.CommonUtil.attributeNonEmpty(w[k],"title")||r.CommonUtil.attributeNonEmpty(w[k],"alt"))return(0,a.RulePass)("pass");if(r.CommonUtil.attributeNonEmpty(l,"aria-labelledby")){var C=l.getAttribute("aria-labelledby").split(/\s+/);for(p=0;p<C.length;++p){var x=o.FragmentUtil.getById(l,C[p]);if(x&&!u.DOMUtil.sameNode(x,l)&&s.VisUtil.isNodeVisible(x)&&r.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&A&&A.name&&A.name.trim().length>0&&("label"===A.nameFrom||"content"===A.nameFrom))return(0,a.RulePass)("pass");var P=l.getAttribute("id");return P&&P.trim().length>0&&l.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:r.CommonUtil.attributeNonEmpty(l,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},7017:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(4377),l=i(4377);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")){var n=l.getAttribute("type").toLowerCase();if("hidden"===n||"submit"===n||"image"===n||"button"===n||"reset"===n)return null}return(0,a.RulePotential)("potential_warning")}}},9980:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(4377);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var l=e.dom.node;if(l.hasAttribute("type")){var n=l.getAttribute("type").toLowerCase();if("hidden"==n||"button"==n)return(0,a.RulePass)("Pass_0")}if(l.hasAttribute("hidden")){var r=l.getAttribute("hidden");if(""==r||"hidden"==r.toLowerCase())return(0,a.RulePass)("Pass_0")}if(l.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(l.hasAttribute("aria-labelledby")&&l.hasAttribute("id")){var o=l.getAttribute("id").trim();return l.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},7733:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(482),o=i(295);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.CommonUtil.hasInnerContentHidden(l))return(0,a.RulePass)("Pass_Regular");if((l.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(l.hasAttribute("aria-labelledby")){var s=r.FragmentUtil.getById(l,l.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,l)&&n.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},1256:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(482),s=i(8656),u=i(1775),d=i(7440);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;if(u.CSSUtil.isMaterialIconFont(l))return(0,a.RulePass)("Pass_0");var c=!0,m=l.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&l.hasAttribute("type")&&(h=l.getAttribute("type").toLowerCase(),-1!==r.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var _=n.AriaUtil.getAriaAttribute(l,"aria-labelledby");if(!_||r.CommonUtil.isIdReferToSelf(l,_)||p){var b=null;if(_&&!r.CommonUtil.isIdReferToSelf(l,_))for(var g=_.split(/\s+/),f=0;f<g.length;++f){var v=o.FragmentUtil.getById(l,g[f]);if(v){b=r.CommonUtil.getInnerText(v);break}}else b=n.AriaUtil.getAriaAttribute(l,"aria-label");if(!b)return null;var A=null;if(p&&(l.hasAttribute("value")?A=l.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var y=r.CommonUtil.getLabelForElementHidden(l,!0);if(!y){var w=d.DOMWalker.parentNode(l);if("label"===w.nodeName.toLowerCase()){var k=w.cloneNode(!0);y=r.CommonUtil.removeAllFormElementsFromLabel(k)}}var C=y||l;A=y||-1===["meter","output","progress","select","textarea"].indexOf(m)?r.CommonUtil.getOnScreenInnerText(C):""}var x=/[^a-zA-Z0-9]/g;A=A.replace(x," ");var P=r.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(x," ");var R=r.CommonUtil.normalizeSpacing(b).toLowerCase();if(P.length>1){var T=R.indexOf(P);if(T>=0&&R.length>P.length){var U=/^[0-9a-zA-Z]+$/;T+P.length<R.length&&R.charAt(T+P.length).match(U)&&(c=!1),c&&T>0&&R.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},9532:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(4377),l=i(4377),n=i(482),r=i(8656);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.getAttribute("for"),s=!1,u=n.FragmentUtil.getById(l,o);if(u){if(!r.VisUtil.isNodeVisible(u)&&!r.VisUtil.isNodeVisible(l))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!r.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},6698:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(7440);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.DOMWalker.parentElement(l);if(!n.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=l.children,d=0;s&&d<u.length;d++)s=n.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},9632:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7440),s=i(8656);t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,u=l.nodeName.toLowerCase();if(r.CommonUtil.isNodeDisabled(l)||s.VisUtil.hiddenByDefaultElements.includes(u))return null;if(null===r.CommonUtil.getAncestor(l,["body"]))return null;if(null!==r.CommonUtil.getAncestor(l,["script","label"]))return null;var d=n.AriaUtil.getRolesWithTypes(l,["widget"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","columnheader","rowheader"],d),null!==n.AriaUtil.getAncestorWithRoles(l,d))return null;for(var c=!0,m=l.firstChild;c&&m;){if("#text"==m.nodeName){var p=m.nodeValue;if(!(c=!/^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(p)))for(var h=new o.DOMWalker(m);!c&&h.prevNode();){var _=h.node.nodeName.toLowerCase();if(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre"].includes(_))break;if("#text"==_){var b=h.node.nodeValue;c=b.length>0&&![" ","\t","\n"].includes(b.charAt(b.length-1))}}}m=m.nextSibling}return c?null:c?void 0:(0,a.RulePotential)("potential_list")}}},3692:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;l=!0;var m=!1;if(o.children&&0!=o.children.length){for(;l&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(n.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}l="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}l=l&&"dt"==u&&"dd"==d||l&&m}else l=!0}else if("li"==s)l=null!=r.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)l=null!=r.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,l=!0;l&&null!=c;)n.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(l=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);l=l&&h||l&&m}else l=!0;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},5430:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(4377),l=i(4377);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},1018:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(4377),l=i(4377),n=i(8656);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.getAttribute("alt").trim().length<=150;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3433:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o="";null==(o="area"==l.nodeName.toLowerCase()?l.getAttribute("href"):l.getAttribute("src"))&&(o="");var s=n.CommonUtil.getFileExt(o),u=0!=s.length&&(n.CommonUtil.isAudioExt(s)||n.CommonUtil.isVideoExt(s)),d=l.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},8012:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,o=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(o)||(l="bgsound"!=o.nodeName.toLowerCase()&&!n.CommonUtil.isAudioObjEmbedLink(o))?null:l?void 0:(0,a.RuleManual)("Manual_1")}}},3881:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(4377),l=i(4377);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l,n=e.dom.node,r=n.nodeName.toLowerCase();if("bgsound"==r)l=!1;else if("param"==r){var o="";n.hasAttribute("value")&&(o=n.getAttribute("value").toLowerCase()),l=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==r){var s;l=!0,n.hasAttribute("flashvars")&&(l=-1==(s=n.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),l&&n.hasAttribute("src")&&(l=-1==(s=n.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(l&&n.hasAttribute("autostart")){var u=n.getAttribute("autostart").toLowerCase();l="true"!=u&&"1"!=u}return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},3106:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(4377),l=i(4377),n=i(8656);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=!0,o=l.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(r=!1),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},1276:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(4377),l=i(4377),n=i(8137);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!n.CommonUtil.isVideoObjEmbedLink(l);return r?null:r?void 0:(0,a.RuleManual)("Manual_1")}}},5424:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o;return(o="applet"!=l.nodeName.toLowerCase()&&!n.CommonUtil.isVideoObjEmbedLink(l))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},4248:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(482),l=i(8137),n=i(4377),r=i(4377);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[{bc659a:{pass:"pass",fail:"fail",fail_longrefresh:"pass"}}],run:function(e,t,i){var r=e.dom.node;if("refresh"!==r.getAttribute("http-equiv").toLowerCase())return null;var o=r.getAttribute("content").toLowerCase();if(!o.match(/^\d+$/)&&!o.match(/^\d+;/))return null;if(l.CommonUtil.triggerOnce(a.FragmentUtil.getOwnerFragment(r),"meta_redirect_optional",!1))return null;var s=o.match(/^(\d+); +[^ ]/);return s&&0!==parseInt(s[1])?parseInt(s[1])<72001?(0,n.RuleFail)("fail"):(0,n.RuleFail)("fail_longrefresh"):(0,n.RulePass)("pass")}}},9526:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(4377),l=i(4377);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"meta_refresh_delay.html",Pass_0:"meta_refresh_delay.html",Potential_1:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",Pass_0:"Rule Passed",Potential_1:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:["bisz58","bc659a"],run:function(e,t,i){var l=e.dom.node;if("refresh"!==l.getAttribute("http-equiv").toLowerCase())return null;var n=l.getAttribute("content").toLowerCase();return n.match(/^\d+$/)||n.match(/^\d+;/)?n.match(/^\d+; +[^ ]/)?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1"):null}}},9379:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(4377),l=i(4377);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{Pass_0:"pass",Potential_1:"fail"}}],run:function(e,t,i){var l=e.dom.node;if("viewport"!==l.getAttribute("name").toLowerCase())return null;var n=l.getAttribute("content").toLowerCase();if(!n||""===n.trim()||!n.includes("maximum-scale")&&!n.includes("user-scalable"))return null;for(var r=null,o=null,s="yes",u="2.0",d=0,c=n.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(r=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var _;return h=Number(u),_=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[r]):_<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},5495:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=n.CommonUtil.hasInnerContentHidden(l);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7753:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(4377),l=i(4377),n=i(8656),r=i(1421);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(l.hasAttribute("type")&&-1!==l.getAttribute("type").indexOf("text"))return null;if(l.getAttribute("role"))return null;var o=l.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=r.AccNameUtil.computeAccessibleName(l);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},1252:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(9193);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(r.AncestorUtil.isFrame(i))return null;for(var l=e.dom.node,o=l.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=l.querySelectorAll("title"),d=0;d<u.length;++d)if(!n.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&n.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},3576:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getInnerText(l).trim(),o=r.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[r]):0===r.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(r)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[r])}}},3617:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(4377),l=i(4377);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},6110:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.CommonUtil.getAncestor(l,"svg"))return(0,a.RulePass)("Pass_0");if(n.CommonUtil.attributeNonEmpty(l,"role"))return(0,a.RulePass)("Pass_0");var r=l.nodeName.toLowerCase(),o="a"==r||"area"==r||"input"==r;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5681:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(4377),l=i(4377),n=i(8137);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"role"),o=l.nodeName.toLowerCase();if(!(r=r||("a"==o||"area"==o)&&n.CommonUtil.attributeNonEmpty(l,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=l.getAttribute("onclick").toLowerCase();r=!0;for(var d=0;r&&d<s.length;++d)r=-1==u.indexOf(s[d])}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},1922:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(4377),l=i(4377);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!l.hasAttribute("onchange")&&!l.hasAttribute("onfocus");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},7906:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(4377),l=i(4377),n=i(8137);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getChildByTagHidden(l,"optgroup",!1,!0).length>0||n.CommonUtil.getChildByTagHidden(l,"option",!1,!0).length<=10;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5451:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(7788),o=i(8656);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&r.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",n.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(l=r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=n.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!l&&p<s.paramSkipText.value.length;++p)l=-1!=m.indexOf(s.paramSkipText.value[p]);else l=!1}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},6349:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(9193),o=i(7788),s=i(8656);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var l,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",n.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(l=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=n.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var _=m.getAttribute("href"),b=_.indexOf("#");-1!=b&&(h=_.substring(b+1))}if(null!=h)for(l=null!=d.getElementById(h),p=0;!l&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(l=!0)}return l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5393:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(4377),l=i(4377),n=i(8137);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase(),o=!0;if("link"===r&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&(o=n.CommonUtil.triggerOnce(l,"style_background_decorative",!1)),o&&"style"===r||l.hasAttribute("style")){var s=("style"===r?n.CommonUtil.getInnerText(l):l.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},9887:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(4377),l=i(4377),n=i(1775);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!0;if("style"===l.nodeName.toLowerCase()){for(var o=n.CSSUtil.getCSSStyle(l),s=0;r&&s<o.length;++s)o[s].selector&&(r=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(r)for(var u=0;u<l.ownerDocument.styleSheets.length;u++)if((g=l.ownerDocument.styleSheets[u]).ownerNode===l)try{var d=g.cssRules?g.cssRules:g.rules;if(d)for(var c=0;r&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;r&&h<v.length;h++)null!==(y=v[h]).selectorText&&void 0!==y.selectorText&&(-1===(k=y.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;r&&h<f.length;h++){var _=f[h];if(_.type&&4===_.type){if(v=_.cssRules)for(var b=0;b<v.length;b++)null!==(y=v[b]).selectorText&&void 0!==y.selectorText&&(-1===(k=y.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}else null!==_.selectorText&&void 0!==_.selectorText&&(-1===(k=_.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=_.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}}}catch(e){}}if("link"===l.nodeName.toLowerCase()&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&l.hasAttribute("href")&&0!==l.getAttribute("href").trim().length)for(u=0;u<l.ownerDocument.styleSheets.length;u++){var g;if((g=l.ownerDocument.styleSheets[u])&&g.ownerNode===l)try{var f;if(f=g.cssRules?g.cssRules:g.rules)for(h=0;r&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;r&&b<v.length;b++){var y;if(null!==(y=v[b]).selectorText&&void 0!==y.selectorText){var w=y.selectorText.toLowerCase();-1===w.indexOf(":before")&&-1===w.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var k,C;-1===(k=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=f[h].style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1)}}}catch(e){}}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5102:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(7440),o=i(7788);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(n).toLowerCase();for(var d=0;d<n.ownerDocument.styleSheets.length;d++)if((g=n.ownerDocument.styleSheets[d])&&g.ownerNode===n)try{for(var c=g.cssRules?g.cssRules:g.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var _=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<_.length;b++)u+=_[b].cssText}}catch(e){}}else if(n.hasAttribute("style"))u=n.getAttribute("style").toLowerCase();else if("link"===s&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(d=0;d<n.ownerDocument.styleSheets.length;d++){var g;if((g=n.ownerDocument.styleSheets[d])&&g.ownerNode===n)try{var f=g.cssRules?g.cssRules:g.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),y=u.replace(/-color/g,"").match(/\bcolor\b/i);if(n.hasAttribute("color")||y||A){var w={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in w||null!==a.CommonUtil.getAncestor(n,w))&&n.hasChildNodes())for(var k=new r.DOMWalker(n);!v&&k.nextNode()&&k.node!==n;)v=k.node.nodeName.toLowerCase()in w}return v||(v=o.CacheUtil.getCache(n.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(n.ownerDocument,"style_color_misuse",!0)),v?(0,l.RulePass)("Pass_0"):v?void 0:(0,l.RulePotential)("Potential_1")}}},9977:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(1775),o=i(8680);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||n.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=r.CSSUtil.getDefinedStyles(s),d=[];d.push(r.CSSUtil.getDefinedStyles(s,":focus")),d.push(r.CSSUtil.getDefinedStyles(s,":focus-visible")),d.push(r.CSSUtil.getDefinedStyles(s,":focus-within"));var c=d[0];if(Object.keys(c).length>0){if(!((u["outline-width"]||u["outline-style"])&&"0px"!==u["outline-width"]&&"none"!==u["outline-style"]||c["outline-style"]&&"none"===c["outline-style"]))return(0,l.RulePass)("pass_focus_visible");var m=!1,p=0;for(var h in c)if(n.checkParams.value.includes(h)){var _=c[h],b=u[h];if(h.includes("style")){if(m="none"===_,b&&"none"!==_&&_===b)return(0,l.RulePotential)("potential_focus_not_visible")}else if(h.includes("width")){if(p++,"initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px"),b&&("initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px")),_=r.CSSUtil.getPixelsFromStyle(_,s),b=r.CSSUtil.getPixelsFromStyle(b,s),0==_||_<=b)return(0,l.RulePotential)("potential_focus_not_visible")}else if(h.includes("color")){p++;var g=o.ColorUtil.ColorCombo(s);if(null===g)continue;var f=g.bg;if(!f)continue;if("initial"===_&&(_="black"),b&&"initial"===b&&(b="black"),_=o.ColorUtil.Color(_),b=o.ColorUtil.Color(b),null===_||null===b)continue;var v=_.contrastRatio(f),A=b.contrastRatio(f);if(v<3||v<=A)return(0,l.RulePotential)("potential_focus_not_visible")}else if(p++,null!=b&&_===b)return(0,l.RulePotential)("potential_focus_not_visible")}if(m&&0===p)return(0,l.RulePotential)("potential_focus_not_visible")}else for(var y in u)if(n.checkParams.value.includes(y)&&"none"!==(b=u[y]))return(0,l.RulePotential)("potential_focus_not_visible");return(0,l.RulePass)("pass_focus_visible")}}},8454:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(4377),l=i(4377),n=i(7788);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase();if("link"===r&&(!l.hasAttribute("rel")||"stylesheet"!==l.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==r&&"link"!==r&&l.hasAttribute("style")&&0===l.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=n.CacheUtil.getCache(l.ownerDocument,"style_highcontrast_visible",!1);return n.CacheUtil.setCache(l.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},25:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(4377),l=i(4377),n=i(8137);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=!1,r=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){n.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,_=!1,b="",g=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var y=A.substring(A.indexOf("+")+1);if(y=y.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=y.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){_=!0;var w=A.substring(A.indexOf("~")+1);b=(w=w.trim()).split(" ")[0]}if(!h&&!_)return(0,a.RulePass)("Pass_0");if(b&&(I=y.indexOf("display:"))&&"none;"!==y.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var k=d.cssRules?d.cssRules:d.rules,C=0;C<k.length;C++){var x=c[C].cssText,P=b+" {",R=x.trim(),T=R.indexOf(P);if(R.slice(T).trim(),R.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=x.split(":")[0];if((U=U.split(" ")[0])===b&&x.match(/:hover/g)){var I;if(g=!0,I=x.indexOf("display:"))if(f=!0,"none;"!==y.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var L=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===L[0].nextElementSibling.tagName){l=!0;continue}}else if(h){if(!r){r=!0;break}continue}if(""!==p&&_){L=s.ownerDocument.getElementsByTagName(p.toUpperCase());var E=[],W=L[0].nextElementSibling;do{if(W.tagName!==b.toUpperCase())break;E.push(W)}while(W=W.nextElementSibling);var q=E.length;if(1===q)return(0,a.RulePass)("Pass_2");if(q>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(C===k.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(C===k.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(C===k.length-1&&!1===g)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===g)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return l?(0,a.RulePass)("Pass_0"):r?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},2884:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(4377),l=i(4377);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!0,r=/\d+(vw|vh|vmin|vmax)/gi,o=l.nodeName.toLowerCase();if("style"===o){for(var s=0;s<l.ownerDocument.styleSheets.length;s++)if((g=l.ownerDocument.styleSheets[s]).ownerNode===l)try{var u=g.cssRules?g.cssRules:g.rules;if(u)for(var d=0;n&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(r);v.length&&p&&(n=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var _=0;n&&_<f.length;_++){var b=f[_];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(r),v.length&&p&&(n=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<l.ownerDocument.styleSheets.length;s++){var g;if((g=l.ownerDocument.styleSheets[s])&&g.ownerNode===l)try{var f;if(f=g.cssRules?g.cssRules:g.rules)for(_=0;n&&_<f.length;_++){var v,A=f[_];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(r),v.length&&p&&(n=!1)}}catch(e){}}else{var y=l.getAttribute("style");y&&(p=y.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(n=!1)}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},5390:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(4377),l=i(4377),n=i(1421),r=i(8656);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l)||r.VisUtil.isNodePresentational(l))return null;var o=n.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},7196:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(4377),l=i(4377),n=i(8137);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){e.dom.node;var l=n.CommonUtil.isTableDescendant(i);if(null!==l&&0!==l.length)return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),l[0].role])}}},9965:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(4377),l=i(4377),n=i(8137);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.CommonUtil.hasInnerContentHidden(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4468:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(4377),l=i(4377),n=i(8137);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return null!=n.CommonUtil.getAncestor(l,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4451:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(4377),l=i(4377),n=i(5755);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.rows;if(!n.TableUtil.isDataTable(l)||null===r||0===r.length)return null;var o=n.TableUtil.tableHeaderExists(l);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},6087:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(295),s=i(8656),u=i(4944);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var l=e.dom.node,d=r.CommonUtil.getAncestor(l,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;l.nodeName.toLowerCase();var m=l.ownerDocument,p=l.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),_=[],b=[],g=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var y=m.getElementById(A);if(y)if(o.DOMUtil.sameNode(y,l))b.push(A);else if(o.DOMUtil.isInSameTable(y,l)){if("th"!==y.nodeName.toLowerCase()){var w=n.AriaUtil.getRoles(y,!0);w.includes("columnheader")||w.includes("rowheader")||f.push(A)}}else g.push(A);else _.push(A)}}var k=[];return 0!=_.length&&k.push((0,a.RuleFail)("Fail_1",[_.toString()])),0!=b.length&&k.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=g.length&&k.push((0,a.RuleFail)("Fail_3",[g.toString()])),0!=f.length&&k.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==k.length?(0,a.RulePass)("Pass_0"):k}}},5864:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(7788),o=i(5755);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,s=n.CommonUtil.getAncestor(l,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===r.CacheUtil.getCache(l,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];r.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var _=parseInt(p.getAttribute("rowspan"));_||(_=1);for(var b=0;u[d][b];)b+=1;for(var g=0;g<_;++g){u[d+g]||(u[d+g]=[]);for(var f=0;f<h;++f)u[d+g][b+f]=p}}}var v=l.ownerDocument,A={},y={};for(d=0;d<u.length;++d){var w=!1;for(m=0;m<u[d].length;++m){var k=u[d][m],C=k.nodeName.toLowerCase();if("th"==C){if("row"==k.getAttribute("scope")?(w=!0,n.CommonUtil.attributeNonEmpty(k,"axis")||(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0)):"col"==k.getAttribute("scope")&&(y[m]=!0,n.CommonUtil.attributeNonEmpty(k,"axis")||(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0)),n.CommonUtil.attributeNonEmpty(k,"headers")){var x=k.getAttribute("headers").split(" ");for(g=0;g<x.length;++g)(P=v.getElementById(x[g].trim()))&&n.CommonUtil.getAncestor(P,"table")==s&&(A[r.CacheUtil.getCache(P,"table_headers_related",null)]=!0)}}else if("td"==C)if(w||y[m])A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0;else if(n.CommonUtil.attributeNonEmpty(k,"headers"))for(x=k.getAttribute("headers").split(" "),g=0;g<x.length;++g){var P;(P=v.getElementById(x[g].trim()))&&n.CommonUtil.getAncestor(P,"table")==s&&(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0,A[r.CacheUtil.getCache(P,"table_headers_related",null)]=!0)}}}r.CacheUtil.setCache(s,"table_headers_related",A)}var R=r.CacheUtil.getCache(l,"table_headers_related",null),T=r.CacheUtil.getCache(s,"table_headers_related",null),U=R&&T&&R in T;return U||"0:0"!==R||0!=n.CommonUtil.getInnerText(l).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===r.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:r.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},4066:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(4377),l=i(4377),n=i(8656),r=i(5755);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var o=!r.TableUtil.isLayoutTable(l);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},2841:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(4377),l=i(4377);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if("td"===l.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var n=l.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},272:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(8656),s=i(5755);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(l))return null;if(s.TableUtil.isDataTable(l))return null;if(n.AriaUtil.isNodeInGrid(l))return null;var u=[];r.CommonUtil.attributeNonEmpty(l,"summary")&&u.push(l);for(var d=l.getElementsByTagName("caption"),c=0;c<d.length;++c)if(r.CommonUtil.getAncestor(d[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=l.getElementsByTagName("th");for(c=0;c<m.length;++c)if(r.CommonUtil.getAncestor(m[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=l.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&r.CommonUtil.getAncestor(p[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=l.nodeName.toLowerCase(),_=new Array,b={};for(c=0;c<u.length;c++){var g=u[c].nodeName.toLowerCase();b.hasOwnProperty(g)||("table"!=g||b.hasOwnProperty.summary?(b[g]=!0,_.push(g)):(b.summary=!0,_.push("summary")))}var f=_.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},1348:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(482),o=i(295);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,s=e.dom.node;if(s.hasAttribute("summary"))l=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=r.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+n.CommonUtil.getInnerText(p).trim().toLowerCase())}}l=d}if(!l)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(l.length>0){var _=n.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return l.includes(_)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},6215:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(8137),l=i(4377),n=i(4377),r=i(5697),o=i(1775);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLocaleLowerCase(),u=new r.DOMMapper,d=u.getUnadjustedBounds(n);if(!d)return null;if(!a.CommonUtil.isTarget(n))return null;if(d.height>=24&&d.width>=24)return(0,l.RulePass)("pass_sized");var c=o.CSSUtil.getInlineStatus(n);if(null===c)return null;if(c.inline)return c.text?null===c.violation?(0,l.RulePass)("pass_inline"):(0,l.RulePotential)("recommendation_inline",[s,c.violation]):null===c.violation?(0,l.RulePass)("pass_default"):(0,l.RulePotential)("recommendation_inline",[s,c.violation]);if(o.CSSUtil.isTargetBrowserDefault(n))return(0,l.RulePass)("pass_default");var m=n.ownerDocument;if(!m)return null;var p=getComputedStyle(n);if(null===p)return null;var h=p.zIndex;h&&!isNaN(Number(h))||(h="0");var _=m.querySelectorAll("body *:not(script):not(style)");if(_&&0!==_.length){for(var b,g=!0,f=24,v=24,A=null,y=null,w=[],k=function(e){var t=_[e];if(n.contains(t))return g=!1,"continue";if(t.contains(n)||!a.CommonUtil.isTarget(t)||w.some((function(e){return e.contains(t)})))return"continue";var i=u.getUnadjustedBounds(t);if(!i)return"continue";var r="0";if((b=getComputedStyle(t))&&((r=b.zIndex)&&!isNaN(Number(r))||(r="0")),i.top<=d.top&&i.left<=d.left&&i.top+i.height>=d.top+d.height&&i.left+i.width>=d.left+d.width)return(g?parseInt(h)<parseInt(r):parseInt(h)<=parseInt(r))?{value:null}:{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])};if(d.top<=i.top&&d.left<=i.left&&d.top+d.height>=i.top+i.height&&d.left+d.width>=i.left+i.width)return(g?parseInt(h)<parseInt(r):parseInt(h)<=parseInt(r))?{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])}:{value:(0,l.RuleFail)("violation_spacing",[s,t.nodeName.toLowerCase()])};if((d.top>=i.top&&d.top<=i.top+i.height||d.top+d.height<=i.top&&d.top+d.height>=i.top+i.height)&&(d.left>i.left&&d.left<i.left+i.width||i.left>d.left&&i.left<d.left+d.width)||(d.top>i.top&&d.top<i.top+i.height||i.top>d.top&&i.top<d.top+d.height)&&(d.left>=i.left&&d.left<=i.left+i.width||d.left+d.width>=i.left&&d.left+d.width<=i.left+i.width))return{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])};var o=24,c=24;d.width<24&&(d.top>=i.top&&d.top<=i.top+i.height||d.top<=i.top&&d.top+d.height>i.top)&&(o=Math.min(Math.abs(d.left-i.left),Math.abs(d.left-(i.left+i.width)),Math.abs(d.left+d.width-(i.left+i.width)),Math.abs(d.left+d.width-i.left))),d.height<24&&(d.left>=i.left&&d.left<=i.left+i.width||d.left<=i.left&&d.left+d.width>i.left)&&(c=Math.min(Math.abs(d.top-i.top),Math.abs(d.top-(i.top+i.height)),Math.abs(d.top+d.height-(i.top+i.height)),Math.abs(d.top+d.height-i.top))),o<f&&(f=o,A=t),c<v&&(v=c,y=t),w.push(t)},C=0;C<_.length;C++){var x=k(C);if("object"==typeof x)return x.value}return Math.round(d.width/2)+f<12||Math.round(d.height/2)+v<12?Math.round(d.width/2)+f<Math.round(d.height/2)+v?(0,l.RuleFail)("violation_spacing",[s,A.nodeName.toLowerCase()]):(0,l.RuleFail)("violation_spacing",[s,y.nodeName.toLowerCase()]):(0,l.RulePass)("pass_spacing")}}}},5275:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7440),s=i(1775),u=i(8656);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.isNodeDisabled(l)||!u.VisUtil.isNodeVisible(l))return null;if(null===r.CommonUtil.getAncestor(l,["body"])||null!==r.CommonUtil.getAncestor(l,["script"]))return null;var d=0,c=l.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],_=new o.DOMWalker(l);_.nextNode();for(var b=!1;!b&&_.nextNode()&&_.node!==l&&_.node!==o.DOMWalker.parentNode(l)&&!["br","div","p"].includes(_.node.nodeName.toLowerCase());)if(_.node!==l&&!r.CommonUtil.shouldNodeBeSkippedHidden(_.node)){var g=_.node.nodeName.toLowerCase();if(3===_.node.nodeType){if(_.node.nodeValue.trim().length>0&&_.node.parentElement){var f=getComputedStyle(_.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],_.node.parentElement)>d)){var v=_.node.nodeValue.trim();(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,_.bEndTag=!0}else b=!0}}else if(1===_.node.nodeType)if("b"===g||"strong"===g||"u"===g||"font"===g){var A;v=r.CommonUtil.getInnerText(_.node),(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,_.bEndTag=!0}else{var y=n.AriaUtil.getResolvedRole(_.node);b=null!==y&&"generic"!==y&&"paragraph"!==y&&"strong"!==y||"applet"===g}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},7900:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(8137),l=i(8656),n=i(8680),r=i(4377),o=i(4377),s=i(1775);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!l.VisUtil.isNodeVisible(o)||null!=l.VisUtil.hiddenByDefaultElements&&null!=l.VisUtil.hiddenByDefaultElements&&l.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var _=c.getComputedStyle(p);if(!1==("0"!==_.width&&"0"!==_.height&&"0"!==_.opacity&&"none"!==_.display&&"hidden"!==_.visibility&&"hidden"!==_.overflow&&("auto"===_.left||"absolute"===_.position&&parseInt(_.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===_.left||"absolute"===_.position&&parseInt(_.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==_.clip){var g=_.clip.toString();if(g.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(g)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===_.position&&b<7&&-1!==b)return null;var y=n.ColorUtil.ColorCombo(p);if(null!==y){var w=y.fg,k=y.bg,C=w.contrastRatio(k),x=s.CSSUtil.getWeightNumber(_.fontWeight),P=s.CSSUtil.getFontInPixels(_.fontSize,p),R=P>=24||P>=18.6&&x>=700;s.CSSUtil.containsCKJ(m)&&(R=P>=29.3||P>=24&&x>=700);var T=C>=4.5||C>=3&&R,U=y.hasBGImage||y.hasGradient,I=y.textShadow,L=a.CommonUtil.isNodeDisabled(p);if(!L){var E=a.CommonUtil.getControlOfLabel(p);E&&(L=a.CommonUtil.isNodeDisabled(E))}return!L&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(L=!0),!L&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(L=!0),!T&&L&&(T=!0),T?(0,r.RulePass)("pass",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient]):U?(0,r.RulePotential)("potential_graphic_background",[C.toFixed(2),P,x]):I?(0,r.RulePotential)("potential_text_shadow",[C.toFixed(2),P,x]):w.toHex()===k.toHex()?(0,r.RulePotential)("potential_same_color",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient]):(0,r.RuleFail)("fail_contrast",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},5027:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;if(null===n.CommonUtil.getAncestor(l,["body"]))return null;for(var o=!0,s=l.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===n.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=n.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=n.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},3496:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(7788),s=i(8656);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,c=l.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===r.CommonUtil.getAncestor(l,["body"]))return null;if(null!==r.CommonUtil.getAncestor(l,["script","a","label"]))return null;var m=n.AriaUtil.getResolvedRole(l);if(m){var p=n.AriaUtil.getRolesWithTypes(l,["landmark"]);if(p&&p.includes(m))return null}var h=n.AriaUtil.getRolesWithTypes(l,["widget","heading"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==n.AriaUtil.getAncestorWithRoles(l,h))return null;for(var _="",b="",g=l.firstChild,f="";g;){if("#text"===g.nodeName){var v=g.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}g=g.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,l="(ss+|"+a[0],n=1;n<a.length;++n){var r=a[n].trim().split(" ");if(l+="|"+r[0],r.length>1)for(var s=1;s<r.length;++s)l+=" +"+r[s]}l+=")",i=new RegExp(l,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(l.ownerDocument,"exemptText");f=f.replace(A," "),_=d(l.ownerDocument,"positionText",f),b=d(l.ownerDocument,"otherText",f)}var y=[];return _&&y.push((0,a.RulePotential)("potential_position",[_])),b&&y.push((0,a.RulePotential)("potential_other",[b])),0==y.length?null:y}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,l={},n=[];return i.split(/\s+/).reduce((function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),r=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=r.indexOf(a[o]),u=a[o].length,d=r.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=r.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}r.length!=u&&1!=c&&1!=m||(l.hasOwnProperty(i)||(l[i]=!0,n.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e}),Object.create(null)),n.join(", ")}},1131:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(4377),l=i(4377),n=i(8137),r=i(8656),o=i(1775),s=i(5697);t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){var l=e.dom.node;if(l.nodeName.toLowerCase(),r.VisUtil.isNodeHiddenFromAT(l)||n.CommonUtil.isNodeDisabled(l))return null;var u=(new s.DOMMapper).getUnadjustedBounds(l);if(!u)return null;if(u.top<0||u.left<0)return null;if(n.CommonUtil.getAncestor(l,"svg"))return null;for(var d="",c=l.childNodes,m=0;m<c.length;++m)3==c[m].nodeType&&(d+=c[m].nodeValue);if(0==d.trim().length)return null;var p=getComputedStyle(l).getPropertyValue("font-size"),h=parseFloat(p),_=o.CSSUtil.getDefinedStyles(l);if(0===Object.keys(_).length)return null;var b=[],g=/(-?[\d.]+)([a-z%]*)/,f=_["word-spacing"];if(f)if((f.startsWith("inherit")||f.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"word-spacing":["*"]},["inherit","unset"]))?f=o.CSSUtil.getDefinedStyles(w)["word-spacing"]:f.startsWith("unset")&&(f="initial")),"important"===l.style.getPropertyPriority("word-spacing"))if("initial"===(f=f.substring(0,f.length-10-1))||"normal"===f)b.push((0,a.RuleFail)("fail_word_spacing_style"));else{var v=parseFloat(f);isNaN(v)?b.push((0,a.RulePass)("pass")):""!==(C=f.trim().match(g))[2]&&0!==C[1]&&(null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<.16?b.push((0,a.RuleFail)("fail_word_spacing_style")):b.push((0,a.RulePass)("pass")))}else b.push((0,a.RulePass)("pass"));var A=_["letter-spacing"];if(A)if((A.startsWith("inherit")||A.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"letter-spacing":["*"]},["inherit","unset"]))?A=o.CSSUtil.getDefinedStyles(w)["letter-spacing"]:A.startsWith("unset")&&(A="initial")),"important"===l.style.getPropertyPriority("letter-spacing"))if("initial"===(A=A.substring(0,A.length-10-1))||"normal"===A)b.push((0,a.RuleFail)("fail_letter_spacing_style"));else{var y=parseFloat(A);isNaN(y)?b.push((0,a.RulePass)("pass")):""!==(C=A.trim().match(g))[2]&&0!==C[1]&&(null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<.12?b.push((0,a.RuleFail)("fail_letter_spacing_style")):b.push((0,a.RulePass)("pass")))}else b.push((0,a.RulePass)("pass"));var w,k=_["line-height"];if(k&&null===o.CSSUtil.getAncestorWithStyles(l,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]}))if((k.startsWith("inherit")||k.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"line-height":["*"]},["inherit","unset"]))?k=o.CSSUtil.getDefinedStyles(w)["line-height"]:k.startsWith("unset")&&(k="initial")),"important"===l.style.getPropertyPriority("line-height"))if("initial"===(k=k.substring(0,k.length-10-1))||"normal"===k)b.push((0,a.RuleFail)("fail_line_height_style"));else{var C,x,P=parseFloat(k);isNaN(P)?b.push((0,a.RulePass)("pass")):""===(C=k.trim().match(g))[2]?C[1]<1.5?b.push((0,a.RuleFail)("fail_line_height_style")):b.push((0,a.RulePass)("pass")):null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<1.5?b.push((0,a.RuleFail)("fail_line_height_style")):b.push((0,a.RulePass)("pass"))}else b.push((0,a.RulePass)("pass"));return b.length>0?b:null}}},8681:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(4377),l=i(4377),n=i(8137);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getAncestor(l,["body","script","code"]);if(null==r||"body"!=r.nodeName.toLowerCase())return null;for(var o=!0,s=l.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},4577:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(4377),l=i(4377),n=i(490),r=i(8137),o=i(4944),s=i(7440),u=i(8656);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&!n.AriaUtil.shouldBePresentationalChild(l)){if("datalist"===l.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=n.AriaUtil.getAncestorWithRole(l,m,!0))return null}var p=o.ARIAMapper.nodeToRole(l),h=0;if(r.CommonUtil.isTabbable(l)&&++h,h<1&&!n.AriaUtil.containsPresentationalChildrenOnly(l)&&l.firstChild)for(var _=new s.DOMWalker(l);h<1&&_.nextNode()&&_.node!=l;)1==_.node.nodeType&&!_.bEndTag&&r.CommonUtil.isTabbable(_.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},8051:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(4377),l=i(4377),n=i(7440),r=i(490),o=i(8137),s=i(4944),u=i(7788),d=i(8656);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(l)&&!o.CommonUtil.isNodeDisabled(l)&&!r.AriaUtil.shouldBePresentationalChild(l)){var c=s.ARIAMapper.nodeToRole(l),m=0;o.CommonUtil.isTabbable(l)&&++m;var p=[];if(m<2&&!r.AriaUtil.containsPresentationalChildrenOnly(l)&&l.firstChild)for(var h=new n.DOMWalker(l);m<2&&h.nextNode()&&h.node!=l;)if(1==h.node.nodeType&&!h.bEndTag&&o.CommonUtil.isTabbable(h.node)){if("input"===h.node.nodeName.toLowerCase()&&"radio"===h.node.getAttribute("type")){var _=h.node.getAttribute("name");if(p.includes(_))continue;p.push(_)}++m}var b=m<2;return b||u.CacheUtil.setCache(l,"widget_tabbable_single","potential_multiple_tabbable"),b?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},1070:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var a=i(4976),l=i(3005),n=[];for(var r in a)n.push(a[r]);var o={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:l.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:n.filter((function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))}]},1421:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(8235),l=i(8137),n=i(490),r=i(8656),o=i(7788),s=i(7440),u=i(295),d=function(){function e(){}return e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),r=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==r)return r;var s=n.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:l.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:l.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(r=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;var u=n.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(r=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=l.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||l.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=l.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,n=t.nodeName.toLowerCase();if(l.CommonUtil.form_labelable_elements.includes(n)&&(m=l.CommonUtil.getFormFieldLabel(t))&&""!==m.trim())return{name:l.CommonUtil.truncateText(m),nameFrom:"label"};if("input"===n&&t.hasAttribute("type"))if(l.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=l.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:l.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(_=l.CommonUtil.getElementAttribute(t,"alt"))&&""!==_.trim())return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"};if("button"===n){if((f=t.innerText)&&""!==f.trim())return{name:l.CommonUtil.truncateText(f),nameFrom:"text"};var d=t.querySelector("img");if(d&&!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===n&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(f=i.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"legend"};if("output"===n&&t.hasAttribute("for")){var c=t.getAttribute("for").trim().split(" ");if(c&&c.length>0){for(var m="",p=0;p<c.length;p++){var h=t.ownerDocument.getElementById(c[p]);!h||u.DOMUtil.sameNode(h,t)||r.VisUtil.isNodeHiddenFromAT(h)||r.VisUtil.isNodePresentational(h)||(a=e.computeAccessibleName(h))&&a.name&&a.name.trim().length>0&&(m+=" "+l.CommonUtil.normalizeSpacing(a.name))}if(m.trim().length>0)return{name:l.CommonUtil.truncateText(m),nameFrom:"label"}}}if("summary"===n&&(f=t.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"legend"};if("details"===n)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:l.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===n&&!(b=t.firstElementChild)&&(b=t.lastElementChild)&&"figcaption"===b.nodeName.toLowerCase()&&(f=b.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"figcaption"};if("img"===n&&t.hasAttribute("alt")){var _=t.getAttribute("alt");return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"}}if("area"===n&&t.hasAttribute("alt")&&(_=t.getAttribute("alt"))&&_.trim().length>0)return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"};if("table"===n){var b,g=t.firstElementChild;if(g&&"caption"===g.nodeName.toLowerCase()&&(b=g.innerText)&&b.trim().length>0)return{name:l.CommonUtil.truncateText(b),nameFrom:"caption"}}if("a"===n){var f;if((f=t.innerText)&&""!==f.trim())return{name:l.CommonUtil.truncateText(f),nameFrom:"text"};var v=t.querySelectorAll(":scope > img, :scope > svg");if(v&&v.length>0){var A="";if(v.forEach((function(t){if(!r.VisUtil.isNodeHiddenFromAT(t)&&!r.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(A+=" "+i.name.trim())}})),""!==A.trim())return{name:A.trim(),nameFrom:"alt"}}}return("optgroup"===n||"option"===n||"track"===n)&&(m=t.getAttribute("label"))&&m.trim().length>0?{name:l.CommonUtil.truncateText(m),nameFrom:"label"}:"svg"===n&&(a=e.computeAccessibleNameForSVGElement(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach((function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}})),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!r.VisUtil.isNodeHiddenFromAT(a)&&!r.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:l.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach((function(e){if("svg"!==e.nodeName.toLowerCase()&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&t.trim().length>0&&(s+=t)}})),""!==s.trim())return{name:l.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=n.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:l.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach((function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}})),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(n.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlostElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:l.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach((function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())})),i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlostElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,n=t.assignedNodes();a<n.length;a++){var r,o=n[a];(r=e.computeAccessibleName(o))&&r.name&&r.name.length>0&&(i+=" "+r.name.trim())}else(r=e.computeAccessibleName(t))&&r.name&&r.name.trim().length>0&&(i+=" "+r.name.trim());return i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;){var n=a.node;if(3===n.nodeType){var o=n.parentElement;!r.VisUtil.isNodeHiddenFromAT(o)&&!r.VisUtil.isNodePresentational(o)&&n.nodeValue&&n.nodeValue.trim().length>0&&(i+=" "+n.nodeValue.trim())}else if(1===n.nodeType&&!r.VisUtil.isNodeHiddenFromAT(n)&&!r.VisUtil.isNodePresentational(n)){var u=e.computeAccessibleName(n);u&&u.name&&u.name.length>0&&(i+=" "+u.name.trim())}}return i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"content"}:null},e}();t.AccNameUtil=d},490:function(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,l=0,n=t.length;l<n;l++)!a&&l in t||(a||(a=Array.prototype.slice.call(t,0,l)),a[l]=t[l]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var l=i(7788),n=i(8235),r=i(4944),o=i(7440),s=i(8656),u=i(8137),d=i(482),c=i(295),m=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase();"aria-"===l.substring(0,5)&&t.push(l)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase();"aria-"===l.substring(0,5)||t.push(l)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase(),n=e.getAttribute(l);""===n&&(n=null),"aria-"===l.substring(0,5)&&t.push({name:l,value:n})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase(),n=e.getAttribute(l);""===n&&(n=null),"aria-"===l.substring(0,5)||t.push({name:l,value:n})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var l=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(l in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][l])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var n=r.ARIAMapper.nodeToRole(t);n in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[n]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[n][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=l.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var n=e.getUserDefinedRoles(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,r),s=!1;if(n&&n.length>0&&o&&o.length>0){for(var d=0;d<n.length;d++)if(o.includes("any")||o.includes(n[d])){if(o.includes("any")&&"generic"===n[d]){s=!0;continue}if(("presentation"===(a=n[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}l.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var l=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),n=0;n<l.length;++n)a.push(l[n]);if(i){var r=e.getImplicitRole(t);null!==r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(r,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=l.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var r=e.getUserDefinedAriaAttributes(t);if(0===r.length)return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=n.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(n.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some((function(e){return r.includes(e)}))){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(n.ARIADefinitions.designPatterns[e]){var i=n.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var l=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var n=t.getAttribute("role").trim().split(" "),r=0;!l&&r<n.length;++r)l=n[r]in i;else for(n=t.getAttribute("role").trim().split(" "),r=0;!l&&r<n.length;++r)l=n[r]===i;if(!l&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(r=0;!l&&r<o.length;++r)l=o[r]in i;else for(r=0;!l&&r<o.length;++r)l=o[r]===i}return l},e.hasRoleInSemantics=function(t,i){var a=!1,l=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var n=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<n.length;++r)l=!0,a=n[r]in i;else for(n=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<n.length;++r)l=!0,a=n[r]===i;if(l)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(r=0;!a&&r<o.length;++r)a=o[r]in i;else for(r=0;!a&&r<o.length;++r)a=o[r]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var l=e.getImplicitRole(t);null!==l&&l.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var l=o.DOMWalker.parentNode(t);null!==l;){if(a){if(e.hasRoleInSemantics(l,i))break}else if(e.hasRole(l,i,!1))break;l=o.DOMWalker.parentNode(l)}return l},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var l=e.getResolvedRole(a);if(null!==l&&i.includes(l))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=l.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(n.ARIADefinitions.designPatterns).forEach((function(e){var a=e[0],l=e[1];t.includes(l.roleType)&&i.push(a)})),l.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=l.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,r=e.getResolvedRole(t);return r&&n.ARIADefinitions.designPatterns[r]&&"widget"===n.ARIADefinitions.designPatterns[r].roleType&&(a=!0),l.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,l){var n=null,r=!1;if(t&&i){for(n=t.nextSibling;null!==n&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(n)||(r=l?e.hasRoleInSemantics(n,i):e.hasRole(n,i,!1)),n=n.nextSibling;if(!n)for(n=t.previousSibling;null!==n&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(n)||(r=e.hasRole(n,i,l)),n=n.previousSibling}return n},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,l){for(var n=null,r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(r.node))&&(l?e.hasRoleInSemantics(r.node,i):e.hasRole(r.node,i,!1))){n=r.node;break}return n},e.getAllDescendantsWithRoles=function(t,i,a,l){if(i&&0!==i.length){var n=[];return i.forEach((function(i){var r=e.getAllDescendantsWithRoleHidden(t,i,a,l);r&&r.length>0&&(n=n.concat(r))})),n}},e.getAllDescendantsWithRoleHidden=function(t,i,a,l){for(var n=[],r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)r.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(r.node)||e.hasRole(r.node,i,l)&&n.push(r.node);return n},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var l=[];if(null!==t.children&&t.children.length>0)for(var n=0;n<t.children.length;n++)l.push(t.children[n]);var r=t.getAttribute("aria-owns");if(r){var o=t.ownerDocument;if(o){var u=r.split(" ");for(n=0;n<u.length;n++){var d=o.getElementById(u[n]);d&&l.push(d)}}}if(l.length>0){for(n=0;n<l.length;n++)if(!s.VisUtil.isNodeHiddenFromAT(l[n])&&s.VisUtil.isNodeVisible(l[n])){var c=e.getRoles(l[n],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(l[n])),c&&null!==c&&c.length>0&&(c=c.filter((function(e){return"none"!==e&&"presentation"!==e}))).includes("group")&&i&&i.includes("group")&&(c=c.filter((function(e){return"group"!==e}))),c&&null!==c&&c.length>0?a.push(l[n]):e.retrieveDirectATChildren(l[n],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var l=["none","presentation"];if(a.some((function(e){return l.includes(e)})))return null;for(var r=n.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)r[a[s]]&&null!==r[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(r[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,l){var n=null,r=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(n=d.FragmentUtil.getById(t,o),c.DOMUtil.sameNode(t,n))return null;r=a&&null!=n&&u.CommonUtil.shouldNodeBeSkippedHidden(n)?null:e.hasRole(n,i,l)}return r?n:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(e,t){if(0===e.length)return!1;var i=e[0].ownerDocument,a=!1,n=null;t&&(n=l.CacheUtil.getCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===n&&(n={});for(var r=0;!a&&r<e.length;++r)if(e[r].hasAttribute)if(e[r].hasAttribute("aria-label")){var o=u.CommonUtil.normalizeSpacing(e[r].getAttribute("aria-label")).toLowerCase();a=o in n,n[o]=!0}else if(e[r].hasAttribute("aria-labelledby")){var s=e[r].getAttribute("aria-labelledby"),m=d.FragmentUtil.getById(e[r],s),p=m&&!c.DOMUtil.sameNode(m,e[r])?u.CommonUtil.getInnerText(m):"",h=u.CommonUtil.normalizeSpacing(p).toLowerCase();a=h in n,n[h]=!0}else a=!0;return t&&l.CacheUtil.setCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",n),!a},e.getAriaLabel=function(e){if(e.hasAttribute){if(e.hasAttribute("aria-labelledby")){for(var t=e.getAttribute("aria-labelledby").trim().split(" "),i="",a=0,l=t.length;a<l;++a){var n=t[a],r=d.FragmentUtil.getById(e,n),o=r&&!c.DOMUtil.sameNode(r,e)?u.CommonUtil.getInnerText(r):"";i+=u.CommonUtil.normalizeSpacing(o).toLowerCase()}return i.trim()}if(e.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(e.getAttribute("aria-label")).toLowerCase().trim()}return""},e.getAriaDescription=function(e){if(!e)return"";var t="",i=e.getAttribute("aria-labelledby");if(i&&i.trim().length>0){for(var a=i.trim().split(" "),l=0,n=a.length;l<n;++l){var r=a[l],o=d.FragmentUtil.getById(e,r),s=o&&!c.DOMUtil.sameNode(o,e)?u.CommonUtil.getInnerText(o):"";s&&s.trim().length>0&&(t+=u.CommonUtil.normalizeSpacing(s).toLowerCase())}if(t.trim().length>0)return t.trim()}return(i=e.getAttribute("aria-description"))&&i.trim().length>0?i.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach((function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1})),i},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(e,t){if(0===e.length)return!1;var i=e[0].ownerDocument,a=null,n=new Array;t&&(a=l.CacheUtil.getCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===a&&(a={});for(var r=0;r<e.length;++r)if(e[r].hasAttribute)if(e[r].hasAttribute("aria-label")){var o=u.CommonUtil.normalizeSpacing(e[r].getAttribute("aria-label")).toLowerCase();a[o]=!0,o in n||(n[o]=new Array),n[o].push(e[r].nodeName.toLowerCase())}else if(e[r].hasAttribute("aria-labelledby")){for(var s=e[r].getAttribute("aria-labelledby").trim().split(" "),m="",p=0,h=s.length;p<h;++p){var _=s[p],b=d.FragmentUtil.getById(e[r],_),g=b&&!c.DOMUtil.sameNode(b,e[r])?u.CommonUtil.getInnerText(b):"";m+=u.CommonUtil.normalizeSpacing(g).toLowerCase()}a[m]=!0,m in n||(n[m]=new Array),n[m].push(e[r].nodeName.toLowerCase())}return t&&l.CacheUtil.setCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",a),n},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var l=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=l in i,i[l]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=l.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var r=null;if(t.tagName?r=t.tagName.toLowerCase():t.nodeName&&(r=t.nodeName.toLowerCase()),null==(i=n.ARIADefinitions.documentConformanceRequirement[r])){var o=n.ARIADefinitions.documentConformanceRequirementSpecialTags[r];switch(r){case"a":case"area":i=u.CommonUtil.attributeNonEmpty(t,"href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,m=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==m&&m.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&c.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()}))[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":i=null!==e.getAncestorWithRole(t,"table",!0)||null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===u.CommonUtil.getScopeForTh(t)?o["des-table-grid-treegrid-column-scope"]:o["des-table-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var _=t.parentElement;i=null!==_&&"dl"===_.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=n.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return l.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=l.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var n;if(null!=(n=null!=i?i:e.getElementAriaProperty(t))){null!==n.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(n.implicitRole,a),null!==n.validRoles&&u.CommonUtil.concatUniqueArrayItemList(n.validRoles,a);var r=e.getImplicitRole(t);r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(n.validRoles,a)}l.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,r){var o=l.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];n.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),n.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),n.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=r&&void 0!==r?r:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=n.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var _=h.props;u.CommonUtil.concatUniqueArrayItemList(_,o),_=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(_,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=n.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var g=n.ARIADefinitions.designPatterns[s[p]];if(null!=g){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=g.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=g.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var y=[],w=0;w<m.otherAllowedAriaAttributes.length;w++)if((x=m.otherAllowedAriaAttributes[w]).includes("=")){var k=x.split("=");t.getAttribute(k[0])===k[1]&&y.push(k[0])}else y.push(x);y.length>0&&u.CommonUtil.concatUniqueArrayItemList(y,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var C=[];for(w=0;w<m.otherDisallowedAriaAttributes.length;w++){var x;(x=m.otherDisallowedAriaAttributes[w]).includes("=")?(k=x.split("="),t.getAttribute(k[0])===k[1]&&C.push(k[0])):C.push(x)}C.length>0&&u.CommonUtil.concatUniqueArrayItemList(C,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),l.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=n.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var l=[],r=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;r=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;r=a.overlapping}for(var o=!1,s=!1,u=0;u<r.length;u++)for(var d=r[u].ariaAttributeValue,c=r[u].htmlAttributeNames,m=r[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var _=null===m||null===m[h]?null:m[h].split(",");null===d?(null===_||_.includes(t[p].value))&&(l.push({result:"Failed",attr:t[p].name}),s=!0):null===_?d===e.value&&(l.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&_.includes("VALUE")&&_[0]!==e.value||d===e.value&&_.includes(t[p].value))&&(l.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&l.push({result:"Pass",attr:""}),l}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var l=n.ARIADefinitions.designPatterns[i[a]];if(null!=l&&!0===l.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=r.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=n.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),l=e.getAllowedAriaRoles(t,a);if(!l||0===l.length)return i;var n=[];if(l.includes("any"))return[];for(var r=0;r<i.length;r++)l.includes(i[r])||n.includes(i[r])||n.push(i[r]);return n},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var l=n.ARIADefinitions.designPatterns,r=0;r<i.length;r++)i[r]in l||a.push(i[r]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var l=[];i&&0!=i.length||(i=e.getImplicitRole(t));var n=e.getUserDefinedAriaAttributes(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,r);if(n)for(var s=0;s<n.length;s++){var u=n[s].trim().toLowerCase();o.includes(u)||l.includes(u)||l.push(u)}return l},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),l=[];if(i&&i.length>0&&a&&a.length>0)for(var n=function(t){var n=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===n)return"continue";n.forEach((function(e){"Failed"===e.result&&l.push({ariaAttr:i[t].name,htmlAttr:e.attr})}))},r=0;r<i.length;r++)n(r);return l},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var l=n.ARIADefinitions.globalDeprecatedRoles,r=0;r<i.length;r++)l.includes(i[r])&&a.push(i[r]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var l=0;l<i.length;l++){var r=i[l].name;"aria-"===r.substring(0,5)&&a.push(r)}if(0===a.length)return[];var o=[],s=n.ARIADefinitions.globalDeprecatedProperties;for(l=0;l<a.length;l++)s.includes(a[l])&&o.push({role:"any",attribute:a[l]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(l=0;l<u.length;l++){var d=n.ARIADefinitions.designPatterns[u[l]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[l],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=m},1775:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(7788),l=i(8137),n=i(490),r=i(5697),o=i(7440),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){try{if(""===t.trim())return!1;if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);for(var i=(e.document||e.ownerDocument).querySelectorAll(t),a=0;a<i.length&&i[a]!==e;)++a;return a<i.length}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getDefinedStyles=function(t,i){if(!t)return null;var l={},n={};function r(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,l=e;a<l.length;a++){var n=l[a];for(var r in n)delete n[r]}break}r=t[i];for(var o=0,s=e;o<s.length;o++){n=s[o];var u=t.getPropertyPriority(r);if(r in n&&n[r].endsWith("!important")){if("important"!==u||n[r].startsWith("inherit")||n[r].startsWith("unset"))continue;n[r]=t[r]+" !important"}else n[r]=t[r]+("important"===u?" !important":"")}}}var o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);if(!i&&o)l=o.definedStyles,n=o.definedStylePseudo;else{for(var s=0;s<t.ownerDocument.styleSheets.length;++s){var u=t.ownerDocument.styleSheets[s];try{if(u&&u.cssRules)for(var d=0;d<u.cssRules.length;++d){var c=u.cssRules[d],m=c.selectorText;if(m){var p=m.match(/^(.*)(:[a-zA-Z-]*)$/),h=!!p,_=h?p[1]:m,b=(h?p[2]:"")===i;i&&":focus"===i&&(_=_.replace(/([ >][^+~ >]+):focus-within/g,"$1")),!h&&e.selectorMatchesElem(t,_)&&r([l,n],c.style),b&&e.selectorMatchesElem(t,_)&&r([n],c.style)}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}r([l,n],t.style),a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",{definedStyles:l,definedStylePseudo:n})}if(i){for(var g in n)n[g]===l[g]&&delete n[g];return n}return l},e.getMediaOrientationTransform=function(e){for(var t={},i=0;i<e.styleSheets.length;++i){var a=e.styleSheets[i];try{if(a&&a.cssRules)for(var l=0;l<a.cssRules.length;++l){var n=a.cssRules[l];if(4===n.MEDIA_RULE){var r=n;if(r&&r.media)for(var o=r.media,s=0;s<o.length;s++)if(o.item(s)){var u=t[o.item(s).toLocaleLowerCase()];u||(u={});for(var d=r.cssRules,c=0;c<d.length;++c){if(1===d[c].STYLE_RULE){var m=d[c],p=m.selectorText;if(p)for(var h={},_=m.style,b=0;b<_.length;++b){var g=_[b];if("transform"===g.toLocaleLowerCase()){if("all"===g&&_[g]){delete h[g];break}h[g]=_[g]}else"rotate"===g.toLocaleLowerCase()&&(h[g]=_[g]);u[p]=h}}o.item(c)&&(t[o.item(c).toLocaleLowerCase()]=u)}}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return t},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var l=i[a].trim();if(""!==l)if(l.startsWith("rotate3d")){var n=l.indexOf("("),r=l.indexOf(")");if(-1!==n&&-1!==r){var o=l.substring(n+1,r),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(l.startsWith("rotate")||l.startsWith("rotateZ")){if(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r){var d;if(!(d=l.substring(n+1,r)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(l.startsWith("matrix3d")){if(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r&&(o=l.substring(n+1,r),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else l.startsWith("matrix")&&(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r&&(o=l.substring(n+1,r),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var l=e.convertValue2Pixels(a[2],a[1],i);return null===l?l:parseFloat(l)},e.convertValue2Pixels=function(e,t,i){if(0==t)return 0;var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t)["font-family"],l=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(l=!0),!l){var n=t.classList;for(var r in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(n.contains(r)){l=!0;break}}if(!l)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var l=t.substring((""+a).length);return e.convertValue2Pixels(l,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var l={},n=void 0;null!=(n=i.exec(t));)l[n[1]]=n[2].trim().toLowerCase();var r=[{selector:null,values:l}];return e.IBM_CSS_THB=r,r}r=[],n=void 0;for(var o=void 0;null!=(n=a.exec(t));){l={};for(var s=n[1],u=n[2];null!=(o=i.exec(u));)l[o[1]]=o[2].trim().toLowerCase();r.push({selector:s,values:l})}return e.IBM_CSS_THB=r,r},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var n=new r.DOMMapper,o=n.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return l.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(l.CommonUtil.isTarget(e)&&o.width<24){var a=n.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return l.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=n.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,l){void 0===l&&(l=[]);for(var n=t;null!==n;){var r=a.CacheUtil.getCache(n,"AriaUtil_AncestorWithStyles",null);if(r)return r;var s=e.getDefinedStyles(n);for(var u in i){var d=s[u];if(d&&(d=d.split(" ")[0],!l.includes(d))){if(i[u].includes("*"))return a.CacheUtil.setCache(n,"AriaUtil_AncestorWithStyles",n),n;if(i[u].includes(d))return a.CacheUtil.setCache(n,"AriaUtil_AncestorWithStyles",n),n}}n=o.DOMWalker.parentElement(n)}return a.CacheUtil.setCache(t,"AriaUtil_AncestorWithStyles",void 0),null},e}();t.CSSUtil=s},7788:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(7440),l=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.clearCaches=function(e){delete e.ownerDocument.aceCache;var t=new a.DOMWalker(e,!1,e,!0);do{delete t.node.aceCache,t.node.ownerDocument&&delete t.node.ownerDocument.aceCache}while(t.nextNode())},e}();t.CacheUtil=l},8680:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(7440),l=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new n(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new n(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new n(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var l=parseInt(t.substring(1,3),16),r=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new n(l,r,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var l=i.defaultView;if(!l)return null;for(var n=[],r=t;r;)1===r.nodeType&&n.push(r),r=a.DOMWalker.parentElement(r);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=l.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,l=null,n=1;n<e.length;++n){for(var r=e[n-1],o=i.contrastRatio(e[n-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[n].mix(e[n-1],u+s).getOverlayColor(t));)r=e[n].mix(e[n-1],u+s).getOverlayColor(t),o=i.contrastRatio(r),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[n].mix(e[n-1],u-s).getOverlayColor(t));)r=e[n].mix(e[n-1],u-s).getOverlayColor(t),o=i.contrastRatio(r),u-=s;s/=10}(null===l||l>o)&&(l=o,a=r)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,_=null;n.length>0;){var b,g=n.pop();if(null!==(b=l.getComputedStyle(g))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],y=0;y<v.length;++y)if(v[y].length){var w=e.Color(v[y]);if(void 0!==w.alpha&&w.alpha<1){var k=_||m;w=w.getOverlayColor(k)}A.push(w)}else v.splice(y--,1);f=c(A,_||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=_&&(_.alpha=p*h,m=_.getOverlayColor(m)),p=1,h=null,_=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(_=f).alpha||1,delete _.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===_?(h=(_=f).alpha||1,delete _.alpha):h=(_=f.getOverlayColor(_)).alpha||1,1===p&&1===h&&1===(_.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=_&&delete(u=u.getOverlayColor(_)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=_&&(_.alpha=p*h,m=_.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=l;var n=function(){function e(e,t,i,a){function l(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=l(e),this.green=l(t),this.blue=l(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var l in e)a+=l+"\n";alert(e),alert(a)}var n=e.relativeLuminance();return i>n?(i+.05)/(n+.05):(n+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,l=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*l)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,n=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var r=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(r)))return null;i=o[1],a=o[2],n=o[3]}else if(t.startsWith("rgba(")){var o;if(r=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(r)))return null;i=o[1],a=o[2],n=o[3]}else{if("#"!=t.charAt(0)){if(!(t in l.CSSColorLookup))return null;t=l.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),n=s(t.substring(5,7))}return new e(i,a,n)},e}();t.ColorObj=n},8137:function(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,l=0,n=t.length;l<n;l++)!a&&l in t||(a||(a=Array.prototype.slice.call(t,0,l)),a[l]=t[l]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var l=i(8235),n=i(7788),r=i(490),o=i(1421),s=i(8656),u=i(295),d=i(7440),c=i(482),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!!t.hasAttribute("contenteditable")},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!r.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter((function(e){return["table","grid","treegrid"].includes(e.role)})):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var l=i.split(" "),n=t.ownerDocument,r=0;r<l.length;r++){var o="//*[@id='"+l[r]+"']";n.evaluate(o,t,n.defaultNSResolver,0,null).iterateNext()||(a+=l[r]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=n.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),n.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,l){for(var n=[],r=t.firstChild;null!=r;){if(r.nodeName.toLowerCase()===i){if((a||l&&!e.shouldCheckHiddenContent(r))&&!s.VisUtil.isNodeVisible(r)){r=r.nextSibling;continue}n.push(r)}r=r.nextSibling}return n},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,l){var o=null;if(null===(o=l?n.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):n.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&l){var m=r.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}l?n.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):n.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var _=i;(i=[]).push(_)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var g=0;g<b.length;++g)h.push(b[g])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=r.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===r.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var l=t.nodeName.toLowerCase();if("object"!=l&&"embed"!=l&&"a"!=l&&"area"!=l)return!1;var n=!1;if(!n&&t.hasAttribute("type")&&(n=a(t.getAttribute("type").toLowerCase())),!n&&t.hasAttribute("codetype")&&(n=a(t.getAttribute("codetype"))),!n){var r="";"embed"===l?r=t.getAttribute("src"):"a"===l||"area"===l?r=t.getAttribute("href"):t.hasAttribute("data")&&(r=t.getAttribute("data")),null===r&&(r=""),n=i(e.getFileExt(r))}if(!n&&"object"===l)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!n&&null!=o&&s<o.length;++s)n=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return n},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,(function(e){return e.startsWith("audio")}))},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,(function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")}))},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,(function(e){return e.startsWith("image")}))},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return n.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=n.CacheUtil.getCache(e,t,!1);return n.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var l in t)if(t[l]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var l=new d.DOMWalker(a);l.nextNode();)if(l.node&&1===l.node.nodeType&&l.elem()&&(l.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(l.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!n.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var l={},r=e.getDocElementsByTag(t,"label"),o=0;o<r.length;++o)if(r[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(r[o]))continue;l[r[o].getAttribute("for")]=r[o]}n.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",l)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return n.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!l.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),n=!1,r=0;a<a.length;++r){var o=document.getElementById(a[r]);if(o&&!u.DOMUtil.sameNode(o,e)){n=!0;break}}return n?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var l=e.getInnerText(a);return l&&""!==l.trim()?l.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,l=e.getLabelForElementHidden(t,!0);if(l)a=l.innerText;else{if(!(l=e.getAncestor(t,"label"))||"label"!==l.tagName.toLowerCase()||!e.isFirstFormElement(l,t))return null;var n=l.cloneNode(!0);n=e.removeAllFormElementsFromLabel(n),a=e.getInnerText(n)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(l,!0))&&""!==a.trim()&&(i+=a.trim()),(a=r.AriaUtil.getAriaLabel(l))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,l=0;l<t.children.length;l++){var n=t.children.item(l);if(e.form_labelable_elements.includes(n.nodeName.toLowerCase())){a=n;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=r.AriaUtil.getResolvedRole(p);if("textbox"===h){var _=p.getAttribute("value");_&&_.trim().length>0&&(m+=" "+_.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var g=p.ownerDocument.getElementById(b);if(g&&!u.DOMUtil.sameNode(p,g)){var f=o.AccNameUtil.computeAccessibleName(g);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=r.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,l=i.length;a<l;++a){var n=c.FragmentUtil.getById(e,i[a]);if(n&&u.DOMUtil.sameNode(n,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),l=e.nodeDepth(i);if(l>a){for(var n=0;n<l-a;++n)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>l){for(n=0;n<a-l;++n)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var l=0;l<i[a].frames.length;++l)try{i[a].frames[l]&&!i.includes(i[a].frames[l])&&i.push(i[a].frames[l])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var l=0,n=t.assignedNodes();l<n.length;l++){var r=n[l];a=a&&e.isInnerTextEmpty(r)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(e){if(!e)return null;if(3===e.nodeType)return e.nodeValue();for(var t="",i=new d.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){if(1===i.node.nodeType&&s.VisUtil.hiddenByDefaultElements.includes(i.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(i.node)||s.VisUtil.isElementOffscreen(i.node)){if(i.node.nextSibling){3===i.node.nextSibling.nodeType&&null!==i.node.nextSibling.nodeValue&&(t+=i.node.nextSibling.nodeValue),i.node=i.node.nextSibling;continue}break}3===i.node.nodeType&&null!==i.node.nodeValue&&(t+=i.node.nodeValue.trim())}return t.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode();)a="img"===l.node.nodeName.toLowerCase()&&e.attributeNonEmpty(l.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode()&&l.node!=t;){var n=l.node;if(!((a="img"===n.nodeName.toLowerCase()&&(e.attributeNonEmpty(n,"alt")||e.attributeNonEmpty(n,"title"))&&!s.VisUtil.isNodeHiddenFromAT(n)&&!s.VisUtil.isNodePresentational(n)||"svg"===n.nodeName.toLowerCase()&&e.svgHasName(n))||1!==n.nodeType||s.VisUtil.isNodeHiddenFromAT(n)||s.VisUtil.isNodePresentational(n)||(a=!e.isInnerTextOnlyEmpty(n))||!0!==i)){a=e.attributeNonEmpty(n,"aria-label")||e.attributeNonEmpty(n,"aria-labelledby");var r=n.ownerDocument;if(r){var o=r.defaultView;if(o){var u=o.getComputedStyle(n);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(n,"alt"))}}}3===n.nodeType&&d.DOMWalker.parentElement(n)===t&&(a=!e.isInnerTextEmpty(n))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode()&&l.node!=t;)!(a="img"===l.node.nodeName.toLowerCase()&&e.attributeNonEmpty(l.node,"alt"))&&(r.AriaUtil.hasRole(l.node,"button",!0)||r.AriaUtil.hasRole(l.node,"textbox"))&&(r.AriaUtil.hasAriaLabel(l.node)||e.attributeNonEmpty(l.node,"title")||e.getLabelForElementHidden(l.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter((function(t){return!e.includes(t)})):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=function(e){return a([],e.parentElement.children,!0).filter((function(e){return 1===e.nodeType&&"TH"!=e.tagName}))};return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},l=t;l;){if(1===l.nodeType){var n=l;n.hasAttribute("id")&&(a[n.getAttribute("id")]=!0)}l=d.DOMWalker.parentNode(l)}for(var r=t.ownerDocument.querySelectorAll("*[aria-labelledby]"),o=0;o<r.length;++o)for(var s=r[o],u=0,m=s.getAttribute("aria-labelledby").split(" ");u<m.length;u++)if(m[u]in a&&!e.isIdReferToSelf(t,t.getAttribute("aria-labelledby")))return s;return null},e.isNodeDisabled=function(t){var i=n.CacheUtil.getCache(t,"PT_NODE_DISABLED",!1);3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),r=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||r&&l.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,n.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),n.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){return"hidden"!==e.getAttribute("type")&&!e.hasAttribute("disabled")},select:function(e){return!e.hasAttribute("disabled")},textarea:!0,a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()}))[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()})).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},5755:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(8656),l=i(490),n=i(8137),r=function(){function e(){}return e.isDataTable=function(e){return!(l.AriaUtil.hasRole(e,"none")||l.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,l=null,r=t.getElementsByTagName("tr"),o=r.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=r[c].getElementsByTagName("th"),l=r[c].getElementsByTagName("td"),u=a.length,0!==(s=l.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&n.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(l[p].hasAttribute("rowspan")||l[p].hasAttribute("colspan")||l[p].hasAttribute("headers")&&n.CommonUtil.normalizeSpacing(l[p].getAttribute("headers")).split(" ").length>2)&&n.CommonUtil.getAncestor(l[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),_=h.length;_>0&&((i=_>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,l=0;i&&l<t.cells.length;l++){var n=t.cells[l];i=e.isTableCellEmpty(n)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,l=i[0],r=0;a&&r<i.length;r++)(l=i[r]).parentNode&&"tfoot"===l.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(l));if(a)return null;for(a=!0,r=0;a&&r<l.cells.length;r++){var o=l.cells[r];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(r=0;a&&r<i.length;r++)for(var c=i[r],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?n.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&n.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every((function(e){return u.includes(e)})))},e.isLayoutTable=function(e){return l.AriaUtil.hasRole(e,"presentation")||l.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter((function(e){return["table","grid","treegrid"].includes(e.role)})):null},e}();t.TableUtil=r},8656:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(7788),l=i(295),n=i(7440),r=i(5697),o=i(490),s=i(1775),u=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=n.DOMWalker.parentNode(t));var i,l=t;if(1!==l.nodeType)return!0;if(!l.ownerDocument)return!0;var r=l.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(r)>-1)return!1;if(void 0!==a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",void 0))return a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",void 0);if(a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",!1)),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(r)){if(!l.ownerDocument.defaultView)return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),!0;i=l.ownerDocument.defaultView.getComputedStyle(l,null);var o=l.getAttribute("hidden"),s=a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",void 0),u="boolean"==typeof l.hidden&&l.hidden;if(!i&&!u&&null==o&&!s)return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),!0;if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(l,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(u||null!=o||s))return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!1),!1;if(e.isContentHidden(l))return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!1),!1}var d=n.DOMWalker.parentNode(l);if(null!=d&&1===d.nodeType){a.CacheUtil.setCache(d,"Visibility_Check_Parent",!0);var c=e.isNodeVisible(d);return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",c),c}return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),!0},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,l=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===l){var r=s.CSSUtil.getDefinedStyles(i);if("absolute"===r.position&&r.clip&&"rect(0px,0px,0px,0px)"===r.clip.replaceAll(" ","")||r.opacity&&parseFloat(r.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=n.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return l},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new r.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?l.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=u},4976:e=>{e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}},t={};function i(a){var l=t[a];if(void 0!==l)return l.exports;var n=t[a]={exports:{}};return e[a].call(n.exports,n,n.exports,i),n.exports}var a={};(()=>{var e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(2306);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var l=i(7884);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return l.Checker}});var n=i(4944);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return n.ARIAMapper}});var r=i(3962);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return r.Config}});var o=i(7440);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}}),String.prototype.startsWith=String.prototype.startsWith||function(e){return 0===this.indexOf(e)},String.prototype.includes=String.prototype.includes||function(e){return-1!==this.indexOf(e)},Array.prototype.includes=Array.prototype.includes||function(e){return-1!==this.indexOf(e)},e.checkDemo=function(e){e||(e=0);var t=new l.Checker;setTimeout((function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then((function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort((function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)}));for(var a=null,l=null,n=0,r=e.results;n<r.length;n++){var o=r[n];l!==o.category&&(null!==l&&(console.groupEnd(),console.groupEnd(),a=null),l=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()}))}),e)}})(),ace=a})(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2024.12.12/js/ace.js.LICENSE.txt b/rule-server/src/static/archives/2024.12.12/js/ace.js.LICENSE.txt new file mode 100644 index 000000000..614ccacb5 --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/js/ace.js.LICENSE.txt @@ -0,0 +1,15 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/rule-server/src/static/archives/2024.12.12/js/ace_s.js b/rule-server/src/static/archives/2024.12.12/js/ace_s.js new file mode 100644 index 000000000..2efee017b --- /dev/null +++ b/rule-server/src/static/archives/2024.12.12/js/ace_s.js @@ -0,0 +1,2 @@ +/*! For license information please see ace.js.LICENSE.txt */ +var ace;(()=>{"use strict";var e={9910:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-grid-treegrid-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-grid-treegrid-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var l in i.designPatterns){var n=i.designPatterns[l].container;if(null!==n)for(var r=0,o=n;r<o.length;r++){var s=o[r];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var n=i(9910),r=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),_=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in n.ARIADefinitions.designPatterns&&n.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){for(var a=e,l=0;l<a.attributes.length;++l){var n=a.attributes[l],r=n.name.toLowerCase();r.startsWith("aria-")&&(i[r.substring(5)]=n.nodeValue)}var o=function(e){if(e in t.elemAttrValueCalculators)for(var l in t.elemAttrValueCalculators[e])if(!(l in i)){var n=t.elemAttrValueCalculators[e][l];null!=n&&("string"!=typeof n&&(n=n(a)),i[l]=n)}};o("global"),o(e.nodeName.toLowerCase())}else if(3===e.nodeType)for(var s in t.textAttrValueCalculators){var u=t.textAttrValueCalculators[s](e);null!=u&&(i[s]=u)}return i},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var l=i[a],n=l.getAttribute("aria-owns").split(/ +/g),r=0;r<n.length;++r){var s=t.getElementById(n[r]);s&&!o.DOMUtil.sameNode(l,s)&&m.CacheUtil.setCache(s,"aria-owned",l)}m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],l=0,n=s;l<n.length;l++){var r=n[l];a.push(r)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||"none",rolePath:i.rolePath+"/"+(this.getRole(e)||"none"),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};"none"===i.role||"/none"===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||"none",rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role="none","none"!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)r=h[c],a.push(r);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var l=new c.ARIAWalker(a,!1,a);do{1===l.node.nodeType&&this.getNodeHierarchy(l.node)}while(l.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role.substring(1));return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),"none"!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var l=a[i];t.push(l)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var n=p.DOMWalker.parentElement(e);this.hierarchyResults=n?m.CacheUtil.getCache(n,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var l=a[i];if("presentation"===l||"none"===l){if(!s.CommonUtil.isFocusable(t))return null}else if(l in n.ARIADefinitions.designPatterns)return l}var r=u.AriaUtil.getImplicitRole(t),o=r&&0!==r.length?r[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:h.AccNameUtil.computeAccessibleName},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){return"checkbox"===e.getAttribute("type")||"radio"===e.getAttribute("type")?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=t.querySelectorAll("li"),a=t.querySelectorAll("ol li, ul li, menu li");return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=t.querySelectorAll("li"),a=0,l=0;l<i.length;++l){var n=i[l];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(n,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(r.CommonMapper);t.ARIAMapper=_},1560:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),l=i(9955),n=i(3946),r=function(){function e(e,t,i){this.root=i||e,this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){c=this.node.slotOwner;var t=this.node.slotIndex+1;delete this.node.slotOwner,delete this.node.slotIndex,t<c.assignedNodes().length?(this.node=c.assignedNodes()[t],this.node.slotOwner=c,this.node.slotIndex=t,this.bEndTag=!1):(this.node=c,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(this.node.nextSibling)this.node=this.node.nextSibling,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var i=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var r=i.indexOf(this.node.getAttribute("id"));r===i.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(i[r+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(i[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&n.VisUtil.isNodeVisible(o)&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else if(1===this.node.nodeType&&n.VisUtil.isNodeVisible(s)&&s.shadowRoot&&s.shadowRoot.firstChild)d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d;else if(1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0){var c=this.node;this.node=u.assignedNodes()[0],this.node.slotOwner=c,this.node.slotIndex=0}else 1!==this.node.nodeType&&11!==this.node.nodeType||!this.node.firstChild?this.bEndTag=!0:this.node=this.node.firstChild}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&l.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var e=this.node,t=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&n.VisUtil.isNodeVisible(e)&&e.contentDocument&&e.contentDocument.documentElement){var i=this.node;this.node=e.contentDocument.documentElement,this.node.ownerElement=i}else 1===this.node.nodeType&&n.VisUtil.isNodeVisible(t)&&t.shadowRoot&&t.shadowRoot.lastChild?(i=this.node,this.node=t.shadowRoot,this.node.ownerElement=i):1!==this.node.nodeType&&11!==this.node.nodeType||!this.node.lastChild?this.bEndTag=!1:this.node=this.node.lastChild}else{if(this.atRoot())return!1;if(this.node.previousSibling)this.node=this.node.previousSibling,this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.ARIAWalker=r},6858:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter((function(e){return e.role===t}));return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter((function(e){return e.role===t}));return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),l=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var l=0,n=t=t.reverse();l<n.length;l++){for(var r=n[l],o=[],s=r.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(r)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||"none";if(this.hierarchyRole.push(t),"none"!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){"none"!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var l=a[i];t.push(l)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=l},920:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,l){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=l,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var l=i.attrs,n=e[i.namespace][t],r=!0,o=0,s=l;o<s.length;o++){var u=s[o];r=r&&u.matches(n)}return i.inclusive||(r=!r),r},e}();t.PartInfo=a;var l=function(){function e(e){this.contextInfo=[];for(var t=[],l=0,n=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);l<n.length;l++){for(var r=n[l].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=r[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}r[2]=r[2].toLowerCase();var c=r[2].split(":"),m="!"!==r[1],p=c.shift(),h=c.join(":"),_=new a(m,p,h,o,r[r.length-1]);t.push(_)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],l=0;l<i.length;++l){var n=new e(i[l]);a.push(n)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var l=a[i];t.push(l)}return t},e}();t.Context=l},7301:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),l=i(920),n=i(4516),r=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,n.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.prototype.run=function(t,i,a,l){var n,r=(new Date).getTime();try{n=this.rule.run(i,a,l)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();n||(n=[]),n instanceof Array||(n=[n]);for(var u=[],d=0,c=n;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var _ in i)h[_]=i[_].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-r,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node)})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.inclRules={},this.exclRules={},this.addMapper(new r.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1),s.CacheUtil.clearCaches(e);var i=new a.DOMWalker(e,!1,e,!0),l={results:[],numExecuted:0,ruleTime:0,totalTime:0},n=(new Date).getTime();for(var r in this.mappers)this.mappers[r].reset(e);do{var c={};for(var r in this.mappers)i.bEndTag?c[r]=this.mappers[r].closeScope(i.node):c[r]=this.mappers[r].openScope(i.node);if(11!==i.node.nodeType&&(d.VisUtil.isNodeVisible(i.node)||"meta"===i.node.nodeName.toLowerCase()||"style"===i.node.nodeName.toLowerCase()||"datalist"===i.node.nodeName.toLowerCase()||"param"===i.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(i.node,["body"]))){var m={};for(var p in c){var h=c[p],_=h[h.length-1];m[p]=_}for(var b={},g=0,f=this.getMatchingRules(c);g<f.length;g++){for(var v=f[g],A=!0,y=0,w=v.rule.dependencies||[];y<w.length;y++)b[w[y]]||(A=!1);if(A){var k=[];try{k=v.run(this,m,t,c)}catch(e){}0===k.length&&(b[v.rule.id]=!0);for(var C=0,x=k;C<x.length;C++){var P=x[C];l.results.push(P),l.ruleTime+=P.ruleTime,l.numExecuted++,P.value[1]===u.eRuleConfidence.PASS&&(b[P.ruleId]=!0)}}}}}while(i.nextNode());return s.CacheUtil.clearCaches(e),l.totalTime=(new Date).getTime()-n,Promise.resolve(l)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=l.Context.parse(e.context),a=0,n=e.id;if(n in this.ruleMap)console.log("WARNING: Rule",n,"already added to engine. Ignoring...");else{this.ruleMap[n]=e;for(var r=0,o=i;r<o.length;r++){var s=o[r],u=n;a>=1&&(u=n+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort((function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0}));for(var e in this.exclRules)this.exclRules[e].sort((function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0}))},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var l=this.nlsMap[e][t||0];return l?l.replace(/\{(\d+)\}/g,(function(e,t,a){return i[t]})):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(n.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,l=i[a].namespace,n=t[l][t[l].length-1],r=n.node;if(!i[a].matches(t,t[l].length-1))return!1;if(1===i.length)return!0;if(n=t[l=i[0].namespace][t[l].length-1],--a,i.slice(0,i.length-1).some((function(e){return e.namespace!==l})))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[l].length-(n.node.isSameNode(r)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var l=0,n=a;l<n.length;l++){var r=n[l];r.rule.enabled&&e.match(r,t)&&i.push(r)}}for(var l in t){var n=l+":"+(t[l].length>0?t[l][t[l].length-1].role:"none");for(var r in n in this.inclRules&&a(this.inclRules[n]),this.exclRules)r!==n&&a(this.exclRules[r]);n!==l+":none"&&(n.startsWith(l+":/")?l+":/*"in this.inclRules&&a(this.inclRules[l+":/*"]):l+":*"in this.inclRules&&a(this.inclRules[l+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var l=a[i];t.push(l)}var n=[],r={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in r)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in r||(d=!1);d&&(o=!0,n.push(u),r[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return n},e}();t.Engine=m},4516:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var n=i(3103),r=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var l=i.attributes[a];t[l.name.toLowerCase()]=l.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0===t){var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+l)*i),top:Math.ceil((a.top+n)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return r.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null}return t},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0===t){var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,n={left:Math.ceil(i.left+a),top:Math.ceil(i.top+l),height:Math.ceil(i.height),width:Math.ceil(i.width)};return r.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",n),n}return null}return t},t}(n.CommonMapper);t.DOMMapper=o},1686:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),l=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],l=e.getAncestor(t,a),n=e.getAncestor(i,a);if(null!==l&&null!=n&&e.sameNode(l,n))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var l=a[i];t.push(this.objectCopyWithNodeRefs(l))}}else for(var n in t={},e)t[n]=this.objectCopyWithNodeRefs(e[n]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var l=a.DOMWalker.parentNode(e);null!==l;){if(1===l.nodeType&&l.getAttribute(t)===i)return l;l=a.DOMWalker.parentNode(l)}return null},e}();t.DOMUtil=l},3864:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),l=function(){function e(e,t,i,a,l){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!l,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],l=a.assignedNodes(),n=0;n<l.length;++n)l[n].slotOwner=a,l[n].slotIndex=n},e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,n=this.node.slotIndex+1;n<l.assignedNodes().length?(this.node=l.assignedNodes()[n],this.bEndTag=!1):(this.node=l,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(this.node.nextSibling)this.node=this.node.nextSibling,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var r=this.node,o=this.node,s=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(r))&&r.contentDocument&&r.contentDocument.documentElement){var u=this.node;this.node=r.contentDocument.documentElement,this.node.ownerElement=u}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.shadowRoot&&o.shadowRoot.firstChild?(u=this.node,this.node=o.shadowRoot,this.node.ownerElement=u,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===o.nodeName.toLowerCase()&&s.assignedNodes().length>0?this.node=s.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!this.node.firstChild||this.node.firstChild.slotOwner?this.bEndTag=!0:this.node=this.node.firstChild}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));var d=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e};return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(d()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(i,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(d()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(d()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(d()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var l=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=l}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild?(l=this.node,this.node=i.shadowRoot,this.node.ownerElement=l,e.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!this.node.lastChild||this.node.lastChild.slotOwner?this.bEndTag=!1:this.node=this.node.lastChild}else{if(this.atRoot())return!1;if(this.node.previousSibling)this.node=this.node.previousSibling,this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=l},4551:function(e,t,i){var a,l=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.StyleMapper=void 0;var n=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return l(t,e),t.prototype.getRole=function(e){return"computed"},t.prototype.getNamespace=function(){return"css"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=i.ownerDocument.defaultView.getComputedStyle(i),l=0;l<a.length;++l){var n=a[l].toLowerCase();t[n]=a[n]}return t},t}(i(3103).CommonMapper);t.StyleMapper=n},8601:(e,t)=>{var i,a,l;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(l=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",l.LEVEL_TWO="2",l.LEVEL_THREE="3",l.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461:(e,t,i)=>{var a,l;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(l=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[l.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var n=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return n.eToolkitLevel}});var r=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return r.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var a=i(461),l=i(7301),n=i(9955),r=i(4551),o=i(6160),s=i(591),u=i(8601),d=[],c={},m={};!function(){var e=JSON.parse(JSON.stringify(l.Engine.getLanguages()));for(var t in e.push("en-US"),s){var i=s[t];d.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(c[i.id]=i.messages[n],c[i.id][0]=c[i.id].group),n in i.help){for(var r in m[i.id]={},i.help[n])m[i.id][r]="/".concat(n,"/").concat(i.help[n][r]);c[i.id][0]=c[i.id].group}}for(var u=0,p=i.rulesets;u<p.length;u++)for(var h=p[u],_=0,b=o.a11yRulesets;_<b.length;_++){var g=b[_];if(("string"==typeof h.id?[h.id]:h.id).includes(g.id))for(var f=0,v=g.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof h.num?[h.num]:h.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:h.reasonCodes,level:h.level,toolkitLevel:h.toolkitLevel}))}}}}();var p=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new l.Engine;e.addMapper(new n.ARIAMapper),e.addMapper(new r.StyleMapper),e.addRules(d),e.addNlsMap(c),e.addHelpMap(m);for(var t=0,i=o.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var l=a[i];l.rules=l.rules||[];for(var n=0,r=l.rules;n<r.length;n++){var o=r[n];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],l=!1,n=0,r=a.checkpoints;n<r.length;n++)for(var o=0,s=r[n].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(l=!0,delete u.enabled)}l&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],l=!1,n=0,r=a.checkpoints;n<r.length;n++)for(var o=0,s=r[n].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(l=!0,u.enabled=!1)}l&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter((function(t){return t.id!==e})),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map((function(e){return e.id}))},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,l=t;a<l.length;a++){var n=l[a];n in this.rulesetRules&&(i=i.concat(this.rulesetRules[n]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var r=this;return this.engine.run(e).then((function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var l=a[i];l.ruleId in c&&(e.nls[l.ruleId]=e.nls[l.ruleId]||{0:c[l.ruleId][0]},l.reasonId in c[l.ruleId]&&(e.nls[l.ruleId][l.reasonId]=c[l.ruleId][l.reasonId]));var n=l.reasonId?l.reasonId:"None";l.value[0]=r.getReasonLevel(t,l.ruleId,n),l.category=r.getCategory(t,l.ruleId),delete l.path.css}return e}))},e.prototype.getLevel=function(e,t){if(!e)return a.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],l=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,r=e;n<r.length;n++){var o=r[n];o in i&&(i[o]===a.eRulePolicy.VIOLATION?l=a.eRulePolicy.VIOLATION:i[o]===a.eRulePolicy.RECOMMENDATION&&null===l?l=a.eRulePolicy.RECOMMENDATION:null===l&&(l=a.eRulePolicy.INFORMATION))}}if(null===l)throw new Error("Rule triggered for which we have no rule level information: "+t);return l},e.prototype.getReasonLevel=function(e,t,i){if(!e)return a.eRulePolicy.INFORMATION;var l=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var r=function(e){e in l&&Object.keys(l[e]).forEach((function(t){var r=null,o=new RegExp("(^|--)".concat(i,"($|--)"));"None"===t?r=l[e].None:o.test(t)&&(r=l[e][t]),r===a.eRulePolicy.VIOLATION?n=a.eRulePolicy.VIOLATION:r===a.eRulePolicy.RECOMMENDATION&&null===n?n=a.eRulePolicy.RECOMMENDATION:null===n&&(n=a.eRulePolicy.INFORMATION)}))},o=0,s=e;o<s.length;o++)r(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return u.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,l=e;a<l.length;a++){var n=l[a];if(n in i)return i[n]}return u.eGuidelineCategory.OTHER},e}();t.Checker=p},2297:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),l=i(3946),n=i(461),r=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:r.eRulePolicy.RECOMMENDATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var r=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(r)&&!a.CommonUtil.isTabbable(r))return null;var o={paramWinText:{value:["new window","new tab"],type:"array"}},s=r.getAttribute("target"),u="_parent"==s||"_self"==s||"_top"==s||null!=a.CommonUtil.getFrameByName(r,s);if(!u){var d=a.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(d+=" "+r.getAttribute("title"));for(var c=0;!u&&c<o.paramWinText.value.length;++c)-1!=d.indexOf(o.paramWinText.value[c])&&(u=!0)}return u?(0,n.RulePass)("pass"):(0,n.RulePotential)("potential_warn")}}},4401:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),l=i(7139),n=i(3946),r=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(i)||l.CommonUtil.isNodeDisabled(i))return null;var r=o.AccNameUtil.computeAccessibleName(i);return r&&r.name&&r.name.trim().length>0||l.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),l=i(3946),n=i(461),r=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(r))return null;if(a.CommonUtil.attributeNonEmpty(r,"alt")){var o=r.getAttribute("alt").trim();return r.hasAttribute("code")&&o==r.getAttribute("code").trim()?(0,n.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(r)?(0,n.RulePass)("Pass_0"):(0,n.RuleFail)("Fail_3")}return(0,n.RuleFail)("Fail_1")}}},9292:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),l=i(3946),n=i(461),r=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var r=!0,o=e.dom.node.childNodes,s=0;r&&s<o.length;s++)1===o[s].nodeType?l.VisUtil.isNodeVisible(o[s])&&(r=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(r=0===o[s].nodeValue.trim().length);return r?(0,n.RulePass)("Pass_0"):(0,n.RulePotential)("Potential_1")}}},9605:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),l=i(3946),n=i(461),r=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(r)?null:a.CommonUtil.attributeNonEmpty(r,"alt")?(0,n.RulePass)("Pass_0"):(0,n.RuleFail)("Fail_1")}}},3987:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),l=i(461),n=i(7011),r=i(3946),o=i(1950);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:form, aria:heading, aria:rowheader, aria:table, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var s=l.nodeName.toLocaleLowerCase();if("svg"!==s){if("table"===s&&l.firstElementChild&&"caption"===l.firstElementChild.nodeName.toLowerCase()&&l.firstElementChild.textContent&&l.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var u=n.AriaUtil.getRolesUndefinedByAria(l);if(u&&u.length>0)return null;var d=n.AriaUtil.getDeprecatedAriaRoles(l);if(d&&d.length>0)return null;var c=n.AriaUtil.getDeprecatedAriaAttributes(l);if(c&&c.length>0)return null;var m=n.AriaUtil.getResolvedRole(l),p=o.AccNameUtil.computeAccessibleName(l);return p&&p.name&&0!==p.name.trim().length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_accessible_name",[l.nodeName.toLowerCase(),m])}}}},8631:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),l=i(461),n=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!1,o=l.nodeName.toLowerCase();if(l.hasAttribute("class")&&"mbl"==l.getAttribute("class").substring(0,3))return null;if(n.CommonUtil.isNodeDisabled(l))return null;if(0!==l.getAttribute("aria-activedescendant").trim().length){(r=n.CommonUtil.isTabbable(l))||(r=n.CommonUtil.getTabbableChildren(l)>0);var s=new Array;s.push(o);var u=new Array;return u.push(l.getAttribute("aria-activedescendant").split(" ").join(", ")),r?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.AriaUtil.hasRoleInSemantics(l,"combobox"))return null;var d=n.AriaUtil.getAriaAttribute(l,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(l,d.trim());if(!c||u.DOMUtil.sameNode(d,l))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(l.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(l.hasAttribute("aria-owns"))for(var p=r.CommonUtil.normalizeSpacing(l.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(l,p[h]))&&!u.DOMUtil.sameNode(v,l)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(n.AriaUtil.hasRoleInSemantics(l,"textbox")&&l.hasAttribute("aria-controls")){m=3;var _=r.CommonUtil.normalizeSpacing(l.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<_.length;h++){var b=o.FragmentUtil.getById(l,_[h]);if(b&&!u.DOMUtil.sameNode(b,l)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var g=r.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<g.length;f++){var v;if((v=o.FragmentUtil.getById(l,g[f]))&&!u.DOMUtil.sameNode(v,l)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_application_label_unique.html",Fail_1:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"application",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_application_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_application_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},8001:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),l=i(461),n=i(1950),r=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_application_labelled.html",Fail_1:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.AccNameUtil.computeAccessibleName(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5778:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_article_label_unique.html",Fail_1:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"article",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_article_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_article_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""===d||!(d in u)||u[d]<=1?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},8118:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),l=i(461),n=i(9910),r=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var l=e.dom.node,o=l.attributes;if(o){for(var s=n.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;r.AriaUtil.isDefinedAriaAttribute(l,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,l.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=n.AriaUtil.getInvalidAriaAttributes(l);if(o&&o.length>0)return null;var s=[],u=n.AriaUtil.getUserDefinedAriaAttributes(l);if(!u||0===u.length)return null;for(var d=n.AriaUtil.getConflictAriaAndHtmlAttributes(l),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&r.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),l=i(461),n=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=[],o=n.AriaUtil.getDeprecatedAriaRoles(l);if(o&&o.length>0)for(var s=0;s<o.length;s++)r.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=n.AriaUtil.getDeprecatedAriaAttributes(l);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?r.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):r.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return r.length>0?r:null}}},5080:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=0,p=n.AriaUtil.getResolvedRole(l);if(p){if(d[p]&&null!=n.AriaUtil.getRoleRequiredProperties(p,l))for(var h=n.AriaUtil.getRoleRequiredProperties(p,l),_=0,b=h.length;_<b;_++)c(l,y=h[_])?(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute(h[_])).length&&u.push(h[_])):"aria-labelledby"==h[_]?"radiogroup"==p&&c(l,"aria-label")&&(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[_]&&"progressbar"==p&&c(l,"aria-valuetext")&&(m++,0==r.CommonUtil.normalizeSpacing(l.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var g=n.AriaUtil.getElementAriaProperty(l),f=[];f.push(p);for(var v=n.AriaUtil.getAllowedAriaAttributes(l,f,g),A=(_=0,v.length);_<A;_++){var y;"aria-checked"!=(y=v[_])&&"aria-selected"!=y&&"aria-expanded"!=y&&"aria-orientation"!=y&&"aria-level"!=y||c(l,y)&&(m++,0!=r.CommonUtil.normalizeSpacing(l.getAttribute(y)).length||u.includes(y)||u.push(y))}}var w=new Array,k=0==u.length;return w.push(u.join(", ")),0==m?null:k?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",w)}}}}},183:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),l=i(461),n=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.AriaUtil.getInvalidAriaAttributes(l);if(r&&r.length>0)return null;var o=n.AriaUtil.getConflictAriaAndHtmlAttributes(l);if(o&&o.length>0)return null;var s=l.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=l.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],_=function(e){var t=n.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach((function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))}))};for(c=0;c<u.length;c++)_(c);return h.length>0?h:null}}},6805:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),l=i(7011),n=i(7139),r=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=n.CommonUtil.hasAttribute,m=l.AriaUtil.getElementAriaProperty(o),p=l.AriaUtil.getResolvedRole(o);if(p){var h=l.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var _=l.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,g=0,f=h.length;g<f;g++)_.includes(h[g])&&(c(o,h[g])||("aria-labelledby"==h[g]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[g]),b=!0):"aria-valuenow"==h[g]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[g]),b=!0):"aria-controls"==h[g]&&"combobox"==p||(s.push(h[g]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,r.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,r.RuleFail)("fail_missing",v)}}}},1886:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var l=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=l.attributes,p=0;if(m)for(var h=0,_=m.length;h<_;h++){var b=m[h].name;if(n.AriaUtil.isDefinedAriaAttribute(l,b)){var g=c[b],f=r.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,g&&g.values){if(-1==g.values.indexOf(f))if(-1!=g.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===g.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(g.values.toString());else for(var A={},y=0;y<v.length;y++)""==v[y]||g.values.includes(v[y])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[y]),d.push(g.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(g.values.toString())}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#int"===g.type){var w=parseInt(f);(isNaN(w)||""+w!==f)&&(s.push(f),u.push(b))}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#decimal"==g.type){var k=parseFloat(f);isNaN(k)&&(s.push(f),u.push(b))}else if(g&&g.type&&"http://www.w3.org/2001/XMLSchema#boolean"==g.type){var C=f.trim().toLowerCase();"true"!==C&&"false"!==C&&(s.push(f),u.push(b))}else g&&g.type&&"http://www.w3.org/2001/XMLSchema#string"==g.type||p--}}var x=new Array,P=0==u.length;return x.push(s.join(", ")),x.push(u.join(", ")),x.push(l.nodeName.toLowerCase()),0==p?null:P?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",x)}}},4078:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_label_unique.html",Fail_1:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"banner",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_banner_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_banner_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},5750:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),l=i(461),n=i(7011);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"banner")?null===n.AriaUtil.getSiblingWithRoleHidden(l,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(l)||r.CommonUtil.isNodeDisabled(l)||n.AriaUtil.containsPresentationalChildrenOnly(l)||n.AriaUtil.shouldBePresentationalChild(l))){if(n.AriaUtil.hasRole(l,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(l.hasAttribute("class")&&"mbl"==l.getAttribute("class").substring(0,3))return null;if("datalist"===l.nodeName.toLowerCase())return null;var u=l.getAttribute("role").trim().toLowerCase().split(/\s+/),d=l.getAttribute("id");if(d&&d.trim().length>0){var c=l.ownerDocument.querySelector("*[aria-controls='".concat(d,"'][aria-haspopup='true'], *[aria-controls='").concat(d,"'][aria-expanded='true']")),m=["combobox","listbox","menu","menubar","radiogroup","tree","treegrid"];if(c&&r.CommonUtil.isTabbable(c)&&u&&u.length>0&&u.some((function(e){return m.includes(e)})))return null}for(var p=!0,h=l.ownerDocument,_=r.CommonUtil.hasAttribute,b=new Array,g="",f=!1,v=0;v<u.length;++v)if(o.ARIADefinitions.containers.includes(u[v])&&"true"!=(_(l,"aria-disabled")?l.getAttribute("aria-disabled"):"")&&!_(l,"aria-activedescendant")&&!r.CommonUtil.isTabbable(l)){var A=o.ARIADefinitions.designPatterns[u[v]].reqChildren;if(A){f=!0,p=!1;for(var y="descendant::*[",w=0;w<A.length;w++)y+="@role='"+A[w]+"' or ";y=y.substring(0,y.length-4)+"]";for(var k=h.evaluate(y,l,r.CommonUtil.defaultNSResolver,0,null),C=k.iterateNext();C&&!p;)if(r.CommonUtil.shouldNodeBeSkippedHidden(C))C=k.iterateNext();else{if(!(p=r.CommonUtil.isTabbable(C)))for(var x=h.evaluate("descendant::*",C,r.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P&&!p;)r.CommonUtil.shouldNodeBeSkippedHidden(P)||(p=r.CommonUtil.isTabbable(C)),P=x.iterateNext();p||(b=C.getAttribute("role").trim().split(" "),g=C.nodeName.toLowerCase()),C=k.iterateNext()}}}var R=new Array,T=new Array;return g.length>0&&b.length>0?(R.push(g),T.push(b.join(", "))):p=!0,f?p?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[R.toString(),T.toString()]):null}}}},514:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&!n.AriaUtil.containsPresentationalChildrenOnly(l)){var s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length||(s=n.AriaUtil.getImplicitRole(l)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some((function(e){return u.includes(e)})))return null;if(s.includes("combobox"))return null;var d=n.AriaUtil.getRequiredChildRoles(l,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=n.AriaUtil.getDirectATChildren(l);if(!m||0==m.length){var p=l.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,_=0;_<m.length;_++){var b=n.AriaUtil.getRoles(m[_],!1);b&&0!=b.length||(b=n.AriaUtil.getImplicitRole(m[_])),b&&b.length>0&&(b.some((function(e){return d.includes(e)}))||h.push(b.join(", ")))}if(h.length>0){for(var g=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),g.push((0,a.RuleFail)("Fail_invalid_child",v))}return g}return(0,a.RulePass)("Pass")}}}},5310:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_unique.html",Fail_1:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"complementary",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_complementary_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_complementary_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},9083:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"complementary")?r.CommonUtil.attributeNonEmpty(l,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),l=i(461),n=i(1950),r=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.AccNameUtil.computeAccessibleName(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!l){(l={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<l.landmarks.value.length;++c)l.mapLandmarks[l.landmarks.value[c]]=!0;for(l.mapPossibleOrphanedWidgets={},c=0;c<l.possibleOrphanedWidgets.value.length;++c)l.mapPossibleOrphanedWidgets[l.possibleOrphanedWidgets.value[c]]=!0;for(l.mapPossibleOrphanedElements={},c=0;c<l.possibleOrphanedElements.value.length;++c)l.mapPossibleOrphanedElements[l.possibleOrphanedElements.value[c]]=!0;for(l.mapNoLandmarkedRoles={},c=0;c<l.noLandmarkedRoles.value.length;++c)l.mapNoLandmarkedRoles[l.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",l)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!r.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,_=n.AriaUtil.hasRole(m,l.mapPossibleOrphanedWidgets,!0);"link"===p&&(_=!1);var b=p in l.mapPossibleOrphanedElements;if(!_&&!b)return null;if(!(h=i.aria.map((function(e){return e.role})).filter((function(e){return e in l.mapLandmarks})).length>0)){for(var g=s.DOMWalker.parentElement(m);!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=s.DOMWalker.parentElement(g);for(g=m.nextElementSibling;!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=g.nextElementSibling;for(g=m.previousElementSibling;!h&&null!=g;)h=o.CacheUtil.getCache(g,"Rpt_Aria_OrphanedContent",!1),g=g.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||n.AriaUtil.hasRole(m,l.mapNoLandmarkedRoles,!0)||n.AriaUtil.getAncestorWithRole(m,l.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_label_unique.html",Fail_1:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"contentinfo",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_contentinfo_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_contentinfo_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3141:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"contentinfo")?r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),l=i(461),n=i(7011);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.AriaUtil.hasRoleInSemantics(l,"contentinfo")?n.AriaUtil.getSiblingWithRoleHidden(l,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["307n5z"],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&n.AriaUtil.containsPresentationalChildrenOnly(l)){var s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length||(s=n.AriaUtil.getImplicitRole(l)),!s||0===s.length)return null;l.tagName.toLowerCase();var u=n.AriaUtil.getDirectATChildren(l);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=0;m<u.length;m++){var p=u[m].nodeName.toLowerCase();if("img"!==p&&"svg"!==p){var h=n.AriaUtil.getRoles(u[m],!1);h&&h.length>0?d.push(h.join(", ")):(h=n.AriaUtil.getImplicitRole(u[m]))&&h.length>0&&c.push(h.join(", "))}}if(d.length>0){for(var _=[],b=0;b<d.length;b++)(g=new Array).push(s.join(", ")),g.push(d[b]),_.push((0,a.RuleFail)("fail_child_explicit_role",g));return _}if(c.length>0){for(_=[],b=0;b<c.length;b++){var g;(g=new Array).push(s.join(", ")),g.push(c[b]),_.push((0,a.RulePotential)("potential_child_implicit_role",g))}return _}}}}},8115:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_document_label_unique.html",Fail_1:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"document",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_document_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_document_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""===d||!(d in u)||u[d]<=1?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},5733:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.getAncestor(l,"svg"))return null;if(n.AriaUtil.hasAnyRole(l,!0))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.isfocusableByDefault(l))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(l.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)l.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_form_label_unique.html",Fail_1:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("form"===l.getAttribute("role")||l.hasAttribute("aria-label")||l.hasAttribute("aria-labelledby")||l.hasAttribute("title")){var s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"form",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_form_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_form_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}return null}}},6731:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),l=i(7011),n=i(7139),r=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=l.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&n.CommonUtil.hasInnerContent(u)}return s||(s=n.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),l=i(461),n=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase();return a.CommonUtil.isTabbable(n)?(0,l.RuleFail)("Fail_1",[r]):(0,l.RulePass)("Pass_0")}}},3900:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var l=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(l)),p=l.attributes,h=new Array,_=0;if(p)for(var b=0,g=p.length;b<g;b++){d=!0;var f=p[b].name;if(n.AriaUtil.isDefinedAriaAttribute(l,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){_++;var y=r.CommonUtil.normalizeSpacing(p[b].nodeValue).length,w=p[b].nodeValue.split(" ");if(y<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&y>=1&&w.length>1){d=!1;for(var k=0,C=w.length;k<C;++k)""!=w[k]&&h.push(w[k])}if(d&&y>=1)for(var x=0,P=w.length;x<P;++x)if(w[x].length>0){var R=m.getElementById(w[x]);if((d=null!=R)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(R)),d)break;""!=w[x]&&h.push(w[x])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,L=new Array;return T||(I.push(c.join(", ")),L.push(l.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==_?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),L.toString()])}}},1218:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),l=i(7011),n=i(7139),r=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=l.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&n.CommonUtil.hasInnerContent(d)}return u||(u=n.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)){var u=!0,d=u,c=l.ownerDocument,m=o.ARIADefinitions.designPatterns,p=n.AriaUtil.getRoles(l,!1);if("datalist"===l.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],_=0,b=h;_<b.length;_++){var g=b[_];if(null!=n.AriaUtil.getAncestorWithRole(l,g,!0))return null}for(var f=r.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(l,"aria-disabled")&&l.getAttribute("aria-disabled")||(u=l.hasAttribute("onkeydown")||l.hasAttribute("onkeypress")||l.hasAttribute("onkeyup"))))if(f(l,"aria-activedescendant"))u=!0;else{var y,w=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(w)for(var k=0,C=w.length;k<C;k++)for(var x="*[contains(@role,'"+w[k]+"')]",P=c.evaluate(x,l,r.CommonUtil.defaultNSResolver,0,null),R=P.iterateNext();R;){if(!(u=R.hasAttribute("onkeydown")||R.hasAttribute("onkeypress")))for(var T="descendant::*",U=(y=c.evaluate(T,R,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)r.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=y.iterateNext();if(!u)break;R=P.iterateNext()}else for(T="descendant::*",U=(y=c.evaluate(T,l,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(r.CommonUtil.shouldNodeBeSkippedHidden(U))U=y.iterateNext();else{var I;(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=y.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var L=new Array;L.push(l.nodeName.toLowerCase());var E=new Array;E.push(v.join(", "));var q=l.getAttribute("id");return q&&q.trim().length>0&&l.ownerDocument.querySelector("*[aria-controls='".concat(q,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[L.toString(),E.toString()])}}}},9973:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),l=i(461),n=i(9955),r=i(1686),o=i(5279),s=i(4566),u=i(1950);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"Pass_0",Fail_0:"Fail_0"}},help:{"en-US":{Pass_0:"aria_landmark_name_unique.html",Fail_0:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{Pass_0:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",Fail_0:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){for(var l=e.dom.node,d=l,c=[];d;)c.unshift(d),d=d.parentElement;c.forEach((function(e){if(null!==e&&("DIALOG"==e.tagName||"dialog"==e.getAttribute("role")))return null}));var m=o.FragmentUtil.getOwnerFragment(l),p=s.CacheUtil.getCache(l.ownerDocument,"aria_landmark_name_unique",null);if(!p){p={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var h=m.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),_=Array.from(h),b=[],g=[],f=[],v=0;v<_.length;v++){for(var A=_[v],y=!1;A;)null!==(A=A.parentElement)&&("DIALOG"!=A.tagName&&"dialog"!=A.getAttribute("role")||(y=!0));y||f.push(_[v])}for(_=f,v=0;v<_.length;v++){var w=[];for(A=_[v].parentElement;A;)w.push(A),A=A.parentElement;for(var k=0;k<w.length;k++){var C=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[k].tagName),x=!1;if(w[k].hasAttribute("role")&&(x=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[k].getAttribute("role"))),C||x){b.push(w[k]);break}if(k===w.length-1){b.push(null);break}}}var P=[];for(v=0;v<_.length;v++){var R=u.AccNameUtil.computeAccessibleName(_[v]);P.push(R&&R.name&&R.name.trim().length>0?R.name.trim():"")}for(v=0;v<b.length;v++){var T=!1,U=!1;for(k=0;k<b.length;k++)if(k!==v){if(null===b[v]&&null===b[k]){if(n.ARIAMapper.nodeToRole(_[v])===n.ARIAMapper.nodeToRole(_[k])){if(P[v]===P[k]){g.push("Fail_0"),T=!0;break}U=!0}}else if(null===b[v]||null===b[k])continue;if(r.DOMUtil.sameNode(b[v],b[k])&&n.ARIAMapper.nodeToRole(_[v])===n.ARIAMapper.nodeToRole(_[k])){if(P[v]===P[k]){g.push("Fail_0"),T=!0;break}U=!0}}T||(U?g.push("Pass_0"):g.push("null"))}p.navigationNodesComputedLabels=P,p.navigationNodes=_,p.navigationNodesParents=b,p.navigationNodesMatchFound=g,s.CacheUtil.setCache(l.ownerDocument,"aria_landmark_name_unique",p)}var I=-1;for(v=0;v<p.navigationNodes.length;v++)l.isSameNode(p.navigationNodes[v])&&(I=v);return-1===I?null:"Pass_0"===p.navigationNodesMatchFound[I]?(0,a.RulePass)("Pass_0",[n.ARIAMapper.nodeToRole(p.navigationNodes[I])]):"Fail_0"===p.navigationNodesMatchFound[I]?(0,a.RuleFail)("Fail_0",[n.ARIAMapper.nodeToRole(p.navigationNodes[I]),p.navigationNodesComputedLabels[I]]):null}}},5711:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){for(var l=e.dom.node,o=n.AriaUtil.getAriaLabel(l),s=n.AriaUtil.getAncestorWithRole(l,"document",!0),u=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0),d=null,c=0;c<u.length;++c)if(u[c]!==l&&(d=(0,a.RulePass)("Pass_0"),n.AriaUtil.getAncestorWithRole(u[c],"document",!0)===s&&n.AriaUtil.getAriaLabel(u[c])===o)){d=(0,a.RuleFail)("Fail_1");break}return d}}},3384:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"main",!0,!0);return 0===o.length||1===o.length?null:n.AriaUtil.hasUniqueAriaLabelledby(o)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_navigation_label_unique.html",Fail_1:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"navigation",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_navigation_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_navigation_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},5757:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),l=i(461),n=i(9910),r=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var l=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(l)||o.CommonUtil.isNodeDisabled(l)||r.AriaUtil.shouldBePresentationalChild(l)||s.VisUtil.isNodePresentational(l))){for(var u=!0,d=n.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map((function(e){return e.role})),_=h[h.length-2],b=2;"none"===_;)b++,_=h[h.length-b];var g=r.AriaUtil.getResolvedRole(l);if(d[g]&&null!=d[g].container){p++,u=!1;for(var f=0,v=(m=d[g].container).length;!u&&f<v&&!(u=_===m[f]);f++);0==u&&c.push(g)}var A=new Array;A.push(c.join(", "));var y=new Array;return y.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),y.toString()])}}}},5232:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_label_unique.html",Fail_1:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("region"===l.getAttribute("role")||l.hasAttribute("aria-label")||l.hasAttribute("aria-labelledby")&&!r.CommonUtil.isIdReferToSelf(l,l.getAttribute("aria-labelledby"))||l.hasAttribute("title")){var s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"region",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_region_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_region_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}return null}}},1891:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(l)?null:n.AriaUtil.hasAriaLabel(l)||r.CommonUtil.attributeNonEmpty(l,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),l=i(461),n=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var l=e.dom.node,r=l.getAttribute("role").trim().toLowerCase();if(0===r.length)return null;if(l.hasAttribute("aria-hidden")&&"true"===l.getAttribute("aria-hidden").toLowerCase())return null;var o=n.AriaUtil.getRolesUndefinedByAria(l);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=r.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),l=i(461),n=i(7011),r=i(9196);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.tagName.toLowerCase(),s=n.AriaUtil.getRoles(l,!1);if(s&&0!==s.length){if(!n.AriaUtil.areRolesDefined(s))return null;if(["td","th","tr"].includes(o)){var u=r.TableUtil.isTableDescendant(i);if(null!==u&&u.length>0)return null}var d=n.AriaUtil.getImplicitRole(l);if(!d||0===d.length)return(0,a.RulePass)("pass");for(var c=[],m=0;m<s.length;m++)d.includes(s[m])?c.push((0,a.RuleFail)("fail_redundant",[s[m],o])):c.push((0,a.RulePass)("pass"));return c.length>0?c:null}}}},1440:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_search_label_unique.html",Fail_1:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"search",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_search_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_search_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},1968:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.tagName.toLowerCase();if(1!==l.nodeType)return null;var s=n.AriaUtil.getRolesUndefinedByAria(l);if(s&&s.length>0)return null;var u=n.AriaUtil.getDeprecatedAriaRoles(l);if(u&&u.length>0)return null;var d=n.AriaUtil.getDeprecatedAriaAttributes(l);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=r.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=n.AriaUtil.getUserDefinedRoles(l);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=n.AriaUtil.getInvalidRoles(l);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&r.CommonUtil.isTabbable(l)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(1!==l.nodeType)return null;var r=n.AriaUtil.getUserDefinedAriaAttributes(l);if(null===r||0===r.length)return null;var o=n.AriaUtil.getUserDefinedRoles(l),s=!0;if(o&&o.length>0){if(!n.AriaUtil.areRolesDefined(o))return null}else o=n.AriaUtil.getImplicitRole(l),s=!1;var u=l.tagName.toLowerCase(),d=n.AriaUtil.getInvalidAriaAttributes(l);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[r.join(", "),u,o.join(", ")])}}},1617:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(l.ownerDocument,"aria_toolbar_label_unique",null);u||(u=n.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(l.ownerDocument,"aria_toolbar_label_unique",u));var d=n.AriaUtil.getAriaLabel(l);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var l=e.dom.node;if(l.hasAttribute("type")&&"hidden"===l.getAttribute("type")||n.AriaUtil.getAncestorWithRole(l,"combobox")&&!n.AriaUtil.hasRoleInSemantics(l,"textbox")&&!n.AriaUtil.hasRoleInSemantics(l,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(l),m=l.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&l.getAttribute("type"),!l.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(l.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(n.AriaUtil.hasRoleInSemantics(l,p[h]))for(var _=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"combobox",!0,!0),b=0;b<_.length;b++){var g=_[b],f=r.CommonUtil.getElementAttribute(g,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(l,v[A])===l)return null}for(var y=!0,w=u.ARIADefinitions.designPatterns,k=n.AriaUtil.getRoles(l,!0),C=0,x=["widget","liveRegion","window"],P=(A=0,k.length);y&&A<P;++A){var R=w[k[A]];R&&R.nameRequired&&R.roleType&&x.includes(R.roleType)&&(++C,!(y=n.AriaUtil.hasAriaLabel(l)||r.CommonUtil.attributeNonEmpty(l,"title")||r.CommonUtil.getLabelForElementHidden(l,!0))&&R.nameFrom&&R.nameFrom.indexOf("contents")>=0&&(y=r.CommonUtil.hasInnerContentOrAlt(l)),y||(y=r.CommonUtil.hasImplicitLabel(l)),y||"img"!==l.tagName.toLowerCase()||l.hasAttribute("role")||!l.hasAttribute("alt")||(y=d.DOMUtil.cleanWhitespace(l.getAttribute("alt")).trim().length>0),R.nameFrom.indexOf("prohibited"))}return 0===C?null:y?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),l=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if("pre"==n.nodeName.toLowerCase()&&(n.previousSibling&&"code"==n.previousSibling.nodeName.toLowerCase()||n.getElementsByTagName("code").length>0||l.CommonUtil.getAncestor(n,"code")))return(0,a.RulePass)("Pass_0");for(var r=!0,o=l.CommonUtil.getInnerText(n),s=0,u=0,d="",c=0;r&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},9272:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),l=i(461),n=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getInnerText(l);l.hasAttribute("style")&&(r=l.getAttribute("style"));var o=-1==r.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),l=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),l=i(461),n=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"cite");if(!r){var o=n.CommonUtil.getDocElementsByTag(l,"cite");r=null!=o&&o.length>0}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7521:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),l=i(461),n=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.innerHTML.trim().length>0;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RuleManual)("Manual_1")}}},1852:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),l=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!1;if("true"===l.getAttribute("aria-hidden"))return null;for(var r=l.getElementsByTagName("track"),o=0;o<r.length;++o)n=n||"captions"===r[o].getAttribute("kind");if(l.textTracks&&l.textTracks.length>0)for(o=0;o<l.textTracks.length;o++)n=n||"captions"===l.textTracks[o].kind;return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),l=i(461),n=i(7011),r=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,d=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=l.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var _=r.FragmentUtil.getById(l,h);if(!_)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var g=new o.DOMWalker(m);!b&&g.nextNode()&&g.node!=m&&g.node!=m.nextSibling;)1===g.node.nodeType&&u.VisUtil.isNodeVisible(g.node)&&(b=g.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=n.AriaUtil.getRoles(_,!0);return 0===["option","gridcell","row","treeitem"].filter((function(e){return v.includes(e)})).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==_.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),l=i(461),n=i(3864),r=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===l.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new n.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!o.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;var u,d="select"===(u=l).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=l.tagName.toLowerCase(),m="true"===(n.AriaUtil.getAriaAttribute(l,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!l.hasAttribute("type")||"text"===l.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var _=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});return _?(_[h]={inputElement:p?l:null,pattern:d,expanded:m},s.CacheUtil.setCache(l.ownerDocument,"combobox",_),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),l=i(461),n=i(3864),r=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,d=s.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=r.AriaUtil.getRoles(m,!0)[0],_=[];if(o.CommonUtil.isTabbable(l)||_.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!r.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var g=new n.DOMWalker(m);b&&g.nextNode()&&(1!==g.node.nodeType||!u.VisUtil.isNodeVisible(g.node)||(b=!o.CommonUtil.isTabbable(g.node)&&!r.AriaUtil.getAriaAttribute(g.node,"aria-activedescendant"),!g.bEndTag||g.node!==m.lastElementChild)););return b||_.push((0,a.RuleFail)("Fail_tabbable_child")),0===_.length?(0,a.RulePass)("Pass"):_}}},1992:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=n.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter((function(e){return c.includes(e)}));if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=l.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!l.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),l=i(461),n=i(5279),r=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var l=e.dom.node,s=r.CacheUtil.getCache(l.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!l.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=l.getAttribute("aria-owns"),!(c=n.FragmentUtil.getById(l,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!l.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=l.getAttribute("aria-controls"),!(c=n.FragmentUtil.getById(l,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),l=i(461),n=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:n.eRulePolicy.INFORMATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(!a.CommonUtil.isTabbable(n))return null;var r=i.aria[i.aria.length-1];return(0,l.RulePass)("Pass_0",[],[{name:r.attributes.name,role:r.role,tabindex:parseInt(n.getAttribute("tabindex")||"0")}])}}},7446:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),l=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==l||"rtl"==l||"auto"==l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=l.getAttribute("href"),s=n.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),l=i(461),n=i(461),r=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;var o=n.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(n,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===n.getAttribute("draggable")?(0,l.RulePotential)("potential_alternative",[o]):"false"===n.getAttribute("draggable")?(0,l.RulePass)("pass_undraggable",[o]):null}}},8135:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeVisible(l)&&!r.CommonUtil.isNodeDisabled(l)&&!r.CommonUtil.isTabbable(l)){var d=n.AriaUtil.getRoles(l,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!l.parentElement||"fieldset"!==l.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(l);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),l=i(461),n=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CacheUtil.getCache(l.ownerDocument,"element_accesskey_unique",{}),o=l.getAttribute("accesskey"),s=!(o in r);return r[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),l=i(461),n=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],r=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("tbody"===l.nodeName.toLowerCase()&&l.hasAttribute("align"))return(0,a.RulePass)("pass");if(l.nodeName.includes("-"))return null;var s=l.nodeName.toLowerCase();if(n.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=l.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];r.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,_=u;h<_.length;h++)p=_[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),l=i(461),n=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{group:"element_id_unique.html",Pass_0:"element_id_unique.html",Fail_1:"element_id_unique.html",Fail_2:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",Pass_0:"Rule Passed",Fail_1:'The <{0}> element has the id "{1}" that is empty',Fail_2:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail"}}],run:function(e,t,i){var l=e.dom.node,r=l.getAttribute("id");return""===r?(0,a.RuleFail)("Fail_1",[l.nodeName.toLowerCase(),r]):n.FragmentUtil.getById(l,r)===l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[l.nodeName.toLowerCase(),r])}}},6027:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),l=i(461),n=i(1043),r=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!n.LangUtil.validPrimaryLang(a))return 1;if(!n.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!n.LangUtil.validPrimaryLang(a))return 3;if(!n.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var l=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][l]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var l=e.dom.node;if("html"===l.nodeName.toLowerCase())return null;var n=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==l.firstChild)for(var m=new o.DOMWalker(l,!1,l,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!r.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),l=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,n=l.nodeName.toLowerCase(),r=l.hasAttribute("href")||!l.hasAttribute("ondblclick")&&!l.hasAttribute("onmousemove")&&(!l.hasAttribute("onmousedown")||l.hasAttribute("onkeydown"))&&(!l.hasAttribute("onmouseup")||l.hasAttribute("onkeyup"))&&(!l.hasAttribute("onmouseover")||l.hasAttribute("onfocus"))&&(!l.hasAttribute("onmouseout")||l.hasAttribute("onblur"))&&(!l.hasAttribute("onclick")||l.hasAttribute("onkeypress")||"a"==n||"button"==n),o=new Array;return r||(l.hasAttribute("ondblclick")&&o.push("ondblclick"),l.hasAttribute("onmousemove")&&o.push("onmousemove"),l.hasAttribute("onmousedown")&&!l.hasAttribute("onkeydown")&&o.push("onmousedown"),l.hasAttribute("onmouseup")&&!l.hasAttribute("onkeyup")&&o.push("onmouseup"),l.hasAttribute("onmouseover")&&!l.hasAttribute("onfocus")&&o.push("onmouseover"),l.hasAttribute("onmouseout")&&!l.hasAttribute("onblur")&&o.push("onmouseout"),l.hasAttribute("onclick")&&!l.hasAttribute("onkeypress")&&"a"!=n&&"button"!=n&&o.push("onclick")),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[n,o.join(", ")])}}},1704:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),l=i(461),n=i(4919),r=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;if(u.CommonUtil.getAncestor(l,["script","meta","title"]))return null;var d=l.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(l),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=n.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach((function(e){Object.keys(m[e]).forEach((function(t){Object.keys(m[e][t]).length>0&&n.CSSUtil.selectorMatchesElem(l,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))}))})),0===p.length)return null;for(var h=[],_=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var r=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach((function(e){t.includes(e)&&(r=!0)})),!r)return"continue";var o=n.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=n.CSSUtil.getDefinedStyles(l);s.transform&&(o+=n.CSSUtil.getRotationDegree(s.transform)),Math.abs(o-360)%360>1?h.push((0,a.RuleFail)("fail_locked",[d])):h.push((0,a.RulePass)("pass"))},b=0;b<p.length;b++)_(b);return h.length>0?h:null}}},5053:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),l=i(461),n=i(461),r=i(3946),o=i(4919);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["0ssw9k"],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeVisible(n)&&!a.CommonUtil.isNodeDisabled(n)){if(a.CommonUtil.getAncestor(n,["iframe","svg","script","meta"]))return null;if(!a.CommonUtil.hasInnerContent(n))return null;var s=n.nodeName.toLowerCase(),u=getComputedStyle(n);if(!("visible"!==u.overflowX&&"hidden"!==u.overflowX||"visible"!==u.overflowY&&"hidden"!==u.overflowY))return null;if(Math.max(n.offsetWidth,n.offsetHeight)<30||Math.min(n.offsetWidth,n.offsetHeight)<15)return null;var d=o.CSSUtil.getPixelsFromStyle(u.paddingLeft,n)+o.CSSUtil.getPixelsFromStyle(u.paddingRight,n),c=o.CSSUtil.getPixelsFromStyle(u.paddingTop,n)+o.CSSUtil.getPixelsFromStyle(u.paddingBottom,n);return n.scrollWidth-n.clientWidth<1+d&&n.scrollHeight-n.clientHeight<1+c?null:a.CommonUtil.isTabbable(n)?(0,l.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(n)>0?(0,l.RulePass)("pass_interactive"):!n.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,l.RuleFail)("fail_scrollable",[s])}}}},4681:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(9910),s=i(4919),u=i(3864),d=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.isNodeDisabled(l)||d.VisUtil.isNodeHiddenFromAT(l))return null;var c=l.nodeName.toLowerCase();if(c in r.CommonUtil.tabTagMap){var m=r.CommonUtil.tabTagMap[c];if("function"==typeof m&&(m=m(l)),m)return null}if(!l.hasAttribute("tabindex")||parseInt(l.getAttribute("tabindex"))<0)return null;var p=s.CSSUtil.getDefinedStyles(l);if("scroll"===p["overflow-x"]||"scroll"===p["overflow-y"]||"auto"===p["overflow-x"]||"auto"===p["overflow-y"])return null;var h=u.DOMWalker.parentNode(l),_=n.AriaUtil.getResolvedRole(h);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(_))return null;var b=n.AriaUtil.getResolvedRole(l);return b?"application"===b?null:"row"===b||"separator"===b||"widget"===o.ARIADefinitions.designPatterns[b].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[b]):(0,a.RuleFail)("fail_no_valid_role")}}},8050:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),l=i(461),n=i(461),r=i(3946),o=i(7507);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n)||!a.CommonUtil.isTabbable(n))return null;var s=n.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(n,["pre","code","script","meta"])||"body"===s||"html"===s)return null;var u=new o.DOMMapper,d=u.getUnadjustedBounds(n);if(!d)return null;if(0===d.height||0===d.width)return null;var c=n.ownerDocument;if(!c)return null;var m=c.defaultView;if(!m)return null;var p=m.getComputedStyle(n);if(null===p)return null;var h=p.zIndex;h&&"auto"!==h||(h="0");var _=c.querySelectorAll("body *:not(script)");if(_&&0!=_.length){var b=[],g=!0;return _.forEach((function(e){if(n.contains(e))g=!1;else if(r.VisUtil.isNodeVisible(e)&&!e.contains(n)){var t=u.getUnadjustedBounds(e),i=m.getComputedStyle(e),a="0";i&&((a=i.zIndex)&&!isNaN(Number(a))||(a="0")),0!==t.height&&0!==t.width&&t.top<=d.top&&t.left<=d.left&&t.top+t.height>=d.top+d.height&&t.left+t.height>=d.left+d.width&&(g?parseInt(h)<parseInt(a):parseInt(h)<=parseInt(a))&&b.push(e)}})),b.length>0?(0,l.RulePotential)("potential_obscured",[]):(0,l.RulePass)("pass")}}}},2644:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),l=i(4919),n=i(461),r=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var s=r.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(r);if(!u)return null;var d=l.CSSUtil.getDefinedStyles(r),c=l.CSSUtil.getDefinedStyles(r,":focus");if(0===u.height||0===u.width)return(0,n.RulePotential)("potential_visible",[]);if("absolute"===d.position&&d.clip&&"rect(0px,0px,0px,0px)"===d.clip.replaceAll(" ","")&&!c.clip){if("input"===s&&("checkbox"===r.getAttribute("type")||"radio"===r.getAttribute("type"))){var m=a.CommonUtil.getLabelForElement(r);if(m&&!a.CommonUtil.isInnerTextEmpty(m)){var p=l.CSSUtil.getDefinedStyles(r,":focus"),h=l.CSSUtil.getDefinedStyles(r,":focus-visible"),_=l.CSSUtil.getDefinedStyles(r,":focus-within"),b=l.CSSUtil.getDefinedStyles(r,":checked");if(p||h||_||b)return(0,n.RulePass)("pass")}}return(0,n.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,n.RulePass)("pass");var g=getComputedStyle(r),f=u.top,v=u.left;if(0===Object.keys(c).length)return(0,n.RulePotential)("potential_visible",[]);var A=["absolute","fixed"];return void 0!==c.top&&(f=A.includes(c.position)||void 0===c.position&&A.includes(g.position)?c.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==c.left&&(v=A.includes(c.position)||void 0===c.position&&A.includes(g.position)?c.left.replace(/\D/g,""):Number.MIN_VALUE),f>=0&&v>=0?(0,n.RulePass)("pass"):(0,n.RulePotential)("potential_visible",[])}}},429:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.CommonUtil.attributeNonEmpty(l,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},7860:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.embed_noembed_exists=void 0;var a=i(461),l=i(461);t.embed_noembed_exists={id:"embed_noembed_exists",context:"dom:embed",refactor:{WCAG20_Embed_HasNoEmbed:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_noembed_exists.html",Potential_1:"embed_noembed_exists.html",group:"embed_noembed_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element is immediately followed by a non-embedded element",group:"<embed> elements should be immediately followed by a non-embedded element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node,n=l.getElementsByTagName("noembed").length>0;if(!n)for(var r=l.nextSibling;!n&&null!==r;){if("noembed"==r.nodeName.toLowerCase())n=!0;else{if("#text"==r.nodeName.toLowerCase()&&r.nodeValue.trim().length>0)break;if(1==r.nodeType)break}r=r.nextSibling}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4617:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),l=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var n=e.dom.node,r=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=n.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<r.length;++d)for(var c=s.indexOf(r[d]),m=r[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==r[d]||"(:"==r[d])&&/\(\:.*\:\)/.test(s))||(";)"==r[d]||"(;"==r[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(r[d],c+1);if(!o){var p=l.CommonUtil.getAncestor(n,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),l=i(461),n=i(7011),r=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,s=n.AriaUtil.getAriaAttribute(l,"aria-errormessage");if(!s)return null;var u=r.FragmentUtil.getById(l,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),l=i(461),n=i(5279),r=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(l)&&!o.CommonUtil.isNodeDisabled(l)){var d=n.FragmentUtil.getOwnerFragment(l),c=r.CacheUtil.getCache(l.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],_=0;_<p.length;_++)p[_].querySelector("input")&&h.push(p[_]);var b=[];for(_=0;_<h.length;_++){var g=u.AccNameUtil.computeAccessibleName(h[_]);b.push(g&&g.name&&g.name.trim().length>0?g.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,r.CacheUtil.setCache(l.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(_=0;_<c.groupsWithInputs.length;_++)if(l.isSameNode(c.groupsWithInputs[_])){if(f=!0,""===c.groupsWithInputsComputedLabels[_]||null===c.groupsWithInputsComputedLabels[_])return(0,a.RuleFail)("Fail_1");for(var A=!1,y=0;y<c.groupsWithInputsComputedLabels.length;y++)_!=y&&c.groupsWithInputsComputedLabels[_]===c.groupsWithInputsComputedLabels[y]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[_]]);v=c.groupsWithInputsComputedLabels[_]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l)||n.CommonUtil.isNodeDisabled(l))return null;var o=n.CommonUtil.getChildByTagHidden(l,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===n.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),l=i(461),n=i(3946),r=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(l.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),l=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=!0,n=e.dom.node.getElementsByTagName("font");if(null!=n)for(var r=0;r<n.length;++r)l=!n[r].hasAttribute("color");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},9797:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),l=i(461),n=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l={paramWinText:{value:["new window"],type:"array"}},r=e.dom.node,o=r.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=n.CommonUtil.getFrameByName(r,o);if(!s){var u=n.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(u+=" "+r.getAttribute("title"));for(var d=0;!s&&d<l.paramWinText.value.length;++d)-1!=u.indexOf(l.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),l=i(461),n=i(5279),r=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CacheUtil.getCache(n.FragmentUtil.getOwnerFragment(l),"RPT_Label_Single",{}),s=l.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),l=i(461),n=i(7011),r=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=!1;if(l.firstChild)for(var s=new r.DOMWalker(l,!0);!o&&s.prevNode()&&s.node!=l;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=n.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var l=0===e.dom.node.getAttribute("onchange").trim().length;return l?null:l?void 0:(0,a.RulePotential)("Potential_1")}}},5498:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),l=i(461),n=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"src")&&n.CommonUtil.isHtmlExt(n.CommonUtil.getFileExt(l.getAttribute("src")));return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},510:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),l=i(461),n=i(1950),r=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;if(l.getAttribute("role"))return null;var o=n.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),l=i(461),n=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.CommonUtil.hasInnerContentHidden(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),l=i(461),n=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.wordCount(n.CommonUtil.getInnerText(l))<=20;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},2104:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),l=i(461),n=i(6858),r=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(n.AncestorUtil.isPresentationFrame(i))return null;var l=e.dom.node,o=l.ownerDocument.doctype?l.ownerDocument.doctype.publicId:"";o||(o="");var s=l.getAttribute("lang"),u=l.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),l=i(461),n=i(7139),r=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,o=!1,s=n.CommonUtil.getDocElementsByTag(l,"frame"),u=n.CommonUtil.getDocElementsByTag(l,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=n.CommonUtil.getDocElementsByTag(l,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,_="";if((h=void 0!==l.ownerDocument.locationFromDAP&&null!=l.ownerDocument.locationFromDAP?l.ownerDocument.locationFromDAP:l.ownerDocument.location)&&(_=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),_.startsWith("file:///")&&(_="file:/"+_.substring(8)),"#"==p.charAt(0)||p.startsWith(_+"#")){var b=n.CommonUtil.getFileAnchor(p);null!=r.FragmentUtil.getById(l,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var g=d[m].getAttribute("name");-1!=g.indexOf("#")&&(g=n.CommonUtil.getFileAnchor(g)),o=g in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),l=i(461),n=i(461),r=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeHiddenFromAT(n)&&!a.CommonUtil.isNodeDisabled(n)){var s=(new o.DOMMapper).getUnadjustedBounds(n);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))>=0)return(0,l.RulePass)("pass");var u=n;return u&&u.contentDocument&&u.contentDocument.documentElement&&a.CommonUtil.getTabbableChildren(n)>0?(0,l.RuleFail)("fail_invalid"):null}}}},1237:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var l=e.dom.node;return l.hasAttribute("type")&&"image"==l.getAttribute("type").toLowerCase()?r.CommonUtil.attributeNonEmpty(l,"alt")?(0,a.RulePass)("Pass_0"):n.AriaUtil.hasAriaLabel(l)?(0,a.RulePass)("Pass_1"):l.hasAttribute("title")&&l.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(l)?null:n.CommonUtil.attributeNonEmpty(l,"alt")||!l.hasAttribute("ismap")&&!n.CommonUtil.attributeNonEmpty(l,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),l=i(461),n=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.ownerDocument.defaultView.getComputedStyle(l);if(null==r)return(0,a.RulePass)("Pass_0");var o=r.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=l.innerHTML&&0!=l.innerHTML.trim().length)s=!1;else{var u=l.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),l=i(461),n=i(7011),r=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=!0;return(n.AriaUtil.hasRole(l,"presentation")||n.AriaUtil.hasRole(l,"none"))&&(o=0==l.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),l=i(461),n=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.nodeName.toLowerCase(),o=!0;if(l.hasAttribute("alt")){var s=l.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=l.getAttribute("area"==r?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),l=i(461),n=i(3946),r=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var l=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(l)||l.getAttribute("alt").trim().length>0?null:r.AriaUtil.getAriaLabel(l).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(l,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),l=i(461),n=i(3864),r=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.CommonUtil.getAncestor(l,"a");if(null==o)return null;var s=l.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new n.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new n.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(3946);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;if(0!==n.AriaUtil.getAriaLabel(l).trim().length)return(0,a.RulePass)("pass");var o=l.hasAttribute("alt")?l.getAttribute("alt"):null;if(null!==o)return 0===o.length||o.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var s=l.hasAttribute("title")?l.getAttribute("title"):null;if(null!==s&&0!==s.length)return 0===s.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===o){var u=n.AriaUtil.getResolvedRole(l,!1);return"presentation"===u||"none"===u?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===o.length?(0,a.RulePass)("pass"):void 0}}},9234:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=!1;if(l.hasAttribute("usemap")){var s=l.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=n.CommonUtil.getDocElementsByTag(l,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=l.getAttribute("longdesc"),s=n.CommonUtil.getFileExt(o),u=0!=s.length&&n.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591:function(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var l=Object.getOwnPropertyDescriptor(t,i);l&&!("get"in l?!t.__esModule:l.writable||l.configurable)||(l={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,l)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),l=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),l(i(2297),t),l(i(4401),t),l(i(4546),t),l(i(9292),t),l(i(9605),t),l(i(3987),t),l(i(8631),t),l(i(8025),t),l(i(1198),t),l(i(8001),t),l(i(5778),t),l(i(8118),t),l(i(2242),t),l(i(3673),t),l(i(5080),t),l(i(183),t),l(i(6805),t),l(i(1886),t),l(i(4078),t),l(i(5750),t),l(i(85),t),l(i(514),t),l(i(5310),t),l(i(9083),t),l(i(6049),t),l(i(5099),t),l(i(2759),t),l(i(3141),t),l(i(5131),t),l(i(5167),t),l(i(8115),t),l(i(5733),t),l(i(5782),t),l(i(6731),t),l(i(390),t),l(i(3900),t),l(i(1218),t),l(i(6734),t),l(i(9973),t),l(i(5711),t),l(i(3384),t),l(i(2762),t),l(i(5757),t),l(i(5232),t),l(i(1891),t),l(i(6142),t),l(i(4863),t),l(i(1440),t),l(i(1968),t),l(i(1617),t),l(i(3475),t),l(i(3370),t),l(i(9272),t),l(i(7735),t),l(i(3923),t),l(i(7521),t),l(i(1852),t),l(i(799),t),l(i(4614),t),l(i(5952),t),l(i(5395),t),l(i(1992),t),l(i(7955),t),l(i(9531),t),l(i(891),t),l(i(7446),t),l(i(6137),t),l(i(6839),t),l(i(8135),t),l(i(507),t),l(i(3566),t),l(i(5173),t),l(i(6027),t),l(i(7515),t),l(i(1704),t),l(i(5053),t),l(i(4681),t),l(i(8050),t),l(i(2644),t),l(i(429),t),l(i(7860),t),l(i(4617),t),l(i(5460),t),l(i(3399),t),l(i(3498),t),l(i(9629),t),l(i(733),t),l(i(9797),t),l(i(7156),t),l(i(3062),t),l(i(3827),t),l(i(5498),t),l(i(510),t),l(i(7722),t),l(i(4597),t),l(i(2104),t),l(i(8260),t),l(i(8920),t),l(i(1237),t),l(i(4101),t),l(i(275),t),l(i(7601),t),l(i(7541),t),l(i(8274),t),l(i(590),t),l(i(8925),t),l(i(9234),t),l(i(8617),t),l(i(1939),t),l(i(7726),t),l(i(3142),t),l(i(1353),t),l(i(2631),t),l(i(8550),t),l(i(8853),t),l(i(3180),t),l(i(1382),t),l(i(953),t),l(i(2222),t),l(i(4678),t),l(i(7578),t),l(i(9964),t),l(i(6401),t),l(i(1174),t),l(i(9907),t),l(i(6032),t),l(i(5622),t),l(i(2240),t),l(i(4019),t),l(i(361),t),l(i(5960),t),l(i(5515),t),l(i(8752),t),l(i(8834),t),l(i(1025),t),l(i(9116),t),l(i(435),t),l(i(6640),t),l(i(2068),t),l(i(7322),t),l(i(5702),t),l(i(1961),t),l(i(3022),t),l(i(375),t),l(i(4658),t),l(i(4605),t),l(i(5294),t),l(i(3506),t),l(i(7475),t),l(i(8064),t),l(i(7942),t),l(i(2219),t),l(i(1473),t),l(i(1912),t),l(i(6539),t),l(i(4),t),l(i(5334),t),l(i(2173),t),l(i(8349),t),l(i(8142),t),l(i(3980),t),l(i(4701),t),l(i(18),t),l(i(9314),t),l(i(1667),t),l(i(9599),t),l(i(4672),t),l(i(4353),t),l(i(7147),t),l(i(1419),t),l(i(855),t),l(i(3420),t),l(i(408),t)},1939:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l)||n.CommonUtil.isNodeDisabled(l))return null;var o=l.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=l.nodeName.toLowerCase();if(!s.every((function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)})))return(0,a.RuleFail)("fail_incorrect");var _=l.hasAttribute("type")?l.getAttribute("type").trim().toLowerCase():"text",b=[],g=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,g=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,_){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),g=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,g=u.tokensMandatoryGroup2_url;break;case"email":g=u.tokensMandatoryGroup2_email;break;case"tel":g=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,g.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(l))return null;var c=function(e){var t=r.CommonUtil.getAncestor(e,"fieldset")||n.AriaUtil.getAncestorWithRole(e,"radiogroup")||n.AriaUtil.getAncestorWithRole(e,"group")||n.AriaUtil.getAncestorWithRole(e,"grid")||n.AriaUtil.getAncestorWithRole(e,"table");return t||(t=r.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=l.getAttribute("type").toLowerCase(),p=n.AriaUtil.getAncestorWithRole(l,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var _=new o.DOMWalker(p,!1,p,!0),b=[],g=[];_.nextNode();)if(!_.bEndTag&&1===_.node.nodeType&&"input"===_.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(_.node)){var f=_.node.getAttribute("type");"checkbox"===f?b.push(_.node):"radio"===f&&g.push(_.node)}for(var v=0;v<b.length;++v){var A=b[v];if((n.AriaUtil.getAncestorWithRole(A,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(A)){var y=A.getAttribute("name")||"";(h.checkboxByName[y]=h.checkboxByName[y]||[]).push(A),h.nameToGroup[y]=h.nameToGroup[y]||c(A),++h.numCheckboxes}}for(v=0;v<g.length;++v){var w=g[v];if((n.AriaUtil.getAncestorWithRole(w,"form")||r.CommonUtil.getAncestor(l,"html")||l.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(w)){var k=w.getAttribute("name")||"";(h.radiosByName[k]=h.radiosByName[k]||[]).push(w),h.nameToGroup[k]=h.nameToGroup[k]||c(w),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var C=l.getAttribute("name"),x=c(l);if(m="radio"===m?"Radio":"Checkbox",C&&""!==C){var P=(h.radiosByName[C]||[]).length,R=(h.checkboxByName[C]||[]).length;return P>0&&R>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",C]):"Radio"===m&&(1===h.numRadios||1===P)||"Checkbox"===m&&1===h.numCheckboxes?null===x?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===R?null===x?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===x?null!==h.nameToGroup[C]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,C]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,C]):h.nameToGroup[C]!==x?(0,a.RuleFail)("fail_notsamegroup",[m,C]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===x?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===x?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),l=i(461),n=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")&&"text"!=(m=l.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=n.CommonUtil.getAncestor(l,"fieldset"))return(0,a.RulePass)("Pass_0");for(var r=n.CommonUtil.getAncestor(l,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=r.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!n.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==l||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(l)||r.CommonUtil.isNodeDisabled(l))return null;var s=n.AriaUtil.getUserDefinedRoles(l);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=l.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=l.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=l.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),l=i(461),n=i(3864),r=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o="";if(l.hasAttribute("type")&&(o=l.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=r.CommonUtil.getLabelForElementHidden(l,!0);if(null===s||!r.CommonUtil.hasInnerContentHidden(s))return null;var u,d=r.CommonUtil.compareNodeOrder(s,l);if(-2===d){u=!1;var c=new n.DOMWalker(s);for(c.node=l;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),l=i(461),n=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")){var r=l.getAttribute("type").toLowerCase();if("text"!=r&&"file"!=r&&"password"!=r)return null}var o=n.CommonUtil.getLabelForElementHidden(l,!0);if(null==o||!n.CommonUtil.hasInnerContentHidden(o))return null;var s=n.CommonUtil.compareNodeOrder(o,l);if(-2===s){var u=n.CommonUtil.getInnerText(l);if(u&&u.trim().length>0&&n.CommonUtil.getInnerText(l).trim()===u.trim())return null;for(var d=!1,c=l.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),l=i(461),n=i(7011),r=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var s=l.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&l.hasAttribute("type")?u=l.getAttribute("type").toLowerCase():("button"===s||n.AriaUtil.hasRoleInSemantics(l,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(l);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):l.hasAttribute("role")&&l.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",l.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,c=l.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;if(r.CommonUtil.getAncestor(l,"table"))return null;if(n.AriaUtil.getAncestorWithRole(l,"combobox")&&!(n.AriaUtil.hasRoleInSemantics(l,"textbox")||n.AriaUtil.hasRoleInSemantics(l,"searchbox")||"input"===c||"select"===c&&n.AriaUtil.hasRoleInSemantics(l,"combobox")))return null;for(var m=["listbox","tree","grid","dialog"],p=0;p<m.length;p++)if(n.AriaUtil.hasRoleInSemantics(l,m[p]))for(var h=r.CommonUtil.getElementsByRoleHidden(l.ownerDocument,"combobox",!0,!0),_=0;_<h.length;_++){var b=h[_],g=r.CommonUtil.getElementAttribute(b,"aria-owns");if(g)for(var f=r.CommonUtil.normalizeSpacing(g.trim()).split(" "),v=0;v<f.length;v++)if(o.FragmentUtil.getById(l,f[v])===l)return null}var A=d.AccNameUtil.computeAccessibleName(l);if(("input"===c||"button"===c)&&A&&A.name&&A.name.trim().length>0&&("label"===A.nameFrom||"internal"===A.nameFrom||"alt"===A.nameFrom))return(0,a.RulePass)("pass");var y=n.AriaUtil.getResolvedRole(l);if(y&&"button"===y&&"input"!==c&&"button"!==c&&!r.CommonUtil.getAncestor(l,"form"))return null;if(A&&A.name&&A.name.trim().length>0&&("text"===A.nameFrom||"title"===A.nameFrom))return(0,a.RulePass)("pass");var w=n.AriaUtil.getAllDescendantsWithRoles(l,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(w&&w.length>0)for(var k=0;k<w.length;k++)if(r.CommonUtil.attributeNonEmpty(w[k],"title")||r.CommonUtil.attributeNonEmpty(w[k],"alt"))return(0,a.RulePass)("pass");if(r.CommonUtil.attributeNonEmpty(l,"aria-labelledby")){var C=l.getAttribute("aria-labelledby").split(/\s+/);for(p=0;p<C.length;++p){var x=o.FragmentUtil.getById(l,C[p]);if(x&&!u.DOMUtil.sameNode(x,l)&&s.VisUtil.isNodeVisible(x)&&r.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&A&&A.name&&A.name.trim().length>0&&("label"===A.nameFrom||"content"===A.nameFrom))return(0,a.RulePass)("pass");var P=l.getAttribute("id");return P&&P.trim().length>0&&l.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:r.CommonUtil.attributeNonEmpty(l,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),l=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if("input"==l.nodeName.toLowerCase()&&l.hasAttribute("type")){var n=l.getAttribute("type").toLowerCase();if("hidden"===n||"submit"===n||"image"===n||"button"===n||"reset"===n)return null}return(0,a.RulePotential)("potential_warning")}}},953:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var l=e.dom.node;if(l.hasAttribute("type")){var n=l.getAttribute("type").toLowerCase();if("hidden"==n||"button"==n)return(0,a.RulePass)("Pass_0")}if(l.hasAttribute("hidden")){var r=l.getAttribute("hidden");if(""==r||"hidden"==r.toLowerCase())return(0,a.RulePass)("Pass_0")}if(l.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(l.hasAttribute("aria-labelledby")&&l.hasAttribute("id")){var o=l.getAttribute("id").trim();return l.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),l=i(461),n=i(7139),r=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.CommonUtil.hasInnerContentHidden(l))return(0,a.RulePass)("Pass_Regular");if((l.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(l.hasAttribute("aria-labelledby")){var s=r.FragmentUtil.getById(l,l.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,l)&&n.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var l=e.dom.node;if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l))return null;if(u.CSSUtil.isMaterialIconFont(l))return(0,a.RulePass)("Pass_0");var c=!0,m=l.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&l.hasAttribute("type")&&(h=l.getAttribute("type").toLowerCase(),-1!==r.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var _=n.AriaUtil.getAriaAttribute(l,"aria-labelledby");if(!_||r.CommonUtil.isIdReferToSelf(l,_)||p){var b=null;if(_&&!r.CommonUtil.isIdReferToSelf(l,_))for(var g=_.split(/\s+/),f=0;f<g.length;++f){var v=o.FragmentUtil.getById(l,g[f]);if(v){b=r.CommonUtil.getInnerText(v);break}}else b=n.AriaUtil.getAriaAttribute(l,"aria-label");if(!b)return null;var A=null;if(p&&(l.hasAttribute("value")?A=l.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var y=r.CommonUtil.getLabelForElementHidden(l,!0);if(!y){var w=d.DOMWalker.parentNode(l);if("label"===w.nodeName.toLowerCase()){var k=w.cloneNode(!0);y=r.CommonUtil.removeAllFormElementsFromLabel(k)}}var C=y||l;A=y||-1===["meter","output","progress","select","textarea"].indexOf(m)?r.CommonUtil.getOnScreenInnerText(C):""}var x=/[^a-zA-Z0-9]/g;A=A.replace(x," ");var P=r.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(x," ");var R=r.CommonUtil.normalizeSpacing(b).toLowerCase();if(P.length>1){var T=R.indexOf(P);if(T>=0&&R.length>P.length){var U=/^[0-9a-zA-Z]+$/;T+P.length<R.length&&R.charAt(T+P.length).match(U)&&(c=!1),c&&T>0&&R.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),l=i(461),n=i(5279),r=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=l.getAttribute("for"),s=!1,u=n.FragmentUtil.getById(l,o);if(u){if(!r.VisUtil.isNodeVisible(u)&&!r.VisUtil.isNodeVisible(l))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!r.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,o=r.DOMWalker.parentElement(l);if(!n.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=l.children,d=0;s&&d<u.length;d++)s=n.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3864),s=i(3946);t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,u=l.nodeName.toLowerCase();if(r.CommonUtil.isNodeDisabled(l)||s.VisUtil.hiddenByDefaultElements.includes(u))return null;if(null===r.CommonUtil.getAncestor(l,["body"]))return null;if(null!==r.CommonUtil.getAncestor(l,["script","label"]))return null;var d=n.AriaUtil.getRolesWithTypes(l,["widget"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","columnheader","rowheader"],d),null!==n.AriaUtil.getAncestorWithRoles(l,d))return null;for(var c=!0,m=l.firstChild;c&&m;){if("#text"==m.nodeName){var p=m.nodeValue;if(!(c=!/^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(p)))for(var h=new o.DOMWalker(m);!c&&h.prevNode();){var _=h.node.nodeName.toLowerCase();if(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre"].includes(_))break;if("#text"==_){var b=h.node.nodeValue;c=b.length>0&&![" ","\t","\n"].includes(b.charAt(b.length-1))}}}m=m.nextSibling}return c?null:c?void 0:(0,a.RulePotential)("potential_list")}}},1174:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;l=!0;var m=!1;if(o.children&&0!=o.children.length){for(;l&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(n.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}l="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}l=l&&"dt"==u&&"dd"==d||l&&m}else l=!0}else if("li"==s)l=null!=r.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)l=null!=r.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,l=!0;l&&null!=c;)n.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(l=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);l=l&&h||l&&m}else l=!0;return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},9907:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),l=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),l=i(461),n=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=l.getAttribute("alt").trim().length<=150;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5622:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o="";null==(o="area"==l.nodeName.toLowerCase()?l.getAttribute("href"):l.getAttribute("src"))&&(o="");var s=n.CommonUtil.getFileExt(o),u=0!=s.length&&(n.CommonUtil.isAudioExt(s)||n.CommonUtil.isVideoExt(s)),d=l.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,o=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(o)||(l="bgsound"!=o.nodeName.toLowerCase()&&!n.CommonUtil.isAudioObjEmbedLink(o))?null:l?void 0:(0,a.RuleManual)("Manual_1")}}},4019:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),l=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l,n=e.dom.node,r=n.nodeName.toLowerCase();if("bgsound"==r)l=!1;else if("param"==r){var o="";n.hasAttribute("value")&&(o=n.getAttribute("value").toLowerCase()),l=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==r){var s;l=!0,n.hasAttribute("flashvars")&&(l=-1==(s=n.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),l&&n.hasAttribute("src")&&(l=-1==(s=n.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(l&&n.hasAttribute("autostart")){var u=n.getAttribute("autostart").toLowerCase();l="true"!=u&&"1"!=u}return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),l=i(461),n=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var r=!0,o=l.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(r=!1),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),l=i(461),n=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!n.CommonUtil.isVideoObjEmbedLink(l);return r?null:r?void 0:(0,a.RuleManual)("Manual_1")}}},5515:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o;return(o="applet"!=l.nodeName.toLowerCase()&&!n.CommonUtil.isVideoObjEmbedLink(l))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(5279),l=i(7139),n=i(461),r=i(461);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_THREE}],act:[{bc659a:{pass:"pass",fail:"fail",fail_longrefresh:"pass"}}],run:function(e,t,i){var r=e.dom.node;if("refresh"!==r.getAttribute("http-equiv").toLowerCase())return null;var o=r.getAttribute("content").toLowerCase();if(!o.match(/^\d+$/)&&!o.match(/^\d+;/))return null;if(l.CommonUtil.triggerOnce(a.FragmentUtil.getOwnerFragment(r),"meta_redirect_optional",!1))return null;var s=o.match(/^(\d+); +[^ ]/);return s&&0!==parseInt(s[1])?parseInt(s[1])<72001?(0,n.RuleFail)("fail"):(0,n.RuleFail)("fail_longrefresh"):(0,n.RulePass)("pass")}}},8834:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),l=i(461);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"meta_refresh_delay.html",Pass_0:"meta_refresh_delay.html",Potential_1:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",Pass_0:"Rule Passed",Potential_1:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:["bisz58","bc659a"],run:function(e,t,i){var l=e.dom.node;if("refresh"!==l.getAttribute("http-equiv").toLowerCase())return null;var n=l.getAttribute("content").toLowerCase();return n.match(/^\d+$/)||n.match(/^\d+;/)?n.match(/^\d+; +[^ ]/)?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1"):null}}},1025:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),l=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{Pass_0:"pass",Potential_1:"fail"}}],run:function(e,t,i){var l=e.dom.node;if("viewport"!==l.getAttribute("name").toLowerCase())return null;var n=l.getAttribute("content").toLowerCase();if(!n||""===n.trim()||!n.includes("maximum-scale")&&!n.includes("user-scalable"))return null;for(var r=null,o=null,s="yes",u="2.0",d=0,c=n.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(r=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var _;return h=Number(u),_=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[r]):_<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l))return null;var o=n.CommonUtil.hasInnerContentHidden(l);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),l=i(461),n=i(3946),r=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;if(l.hasAttribute("type")&&-1!==l.getAttribute("type").indexOf("text"))return null;if(l.getAttribute("role"))return null;var o=l.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=r.AccNameUtil.computeAccessibleName(l);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),l=i(461),n=i(7139),r=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(r.AncestorUtil.isFrame(i))return null;for(var l=e.dom.node,o=l.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=l.querySelectorAll("title"),d=0;d<u.length;++d)if(!n.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&n.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),l=i(461),n=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getInnerText(l).trim(),o=r.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[r]):0===r.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(r)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[r])}}},7322:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),l=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},5702:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),l=i(461),n=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.CommonUtil.getAncestor(l,"svg"))return(0,a.RulePass)("Pass_0");if(n.CommonUtil.attributeNonEmpty(l,"role"))return(0,a.RulePass)("Pass_0");var r=l.nodeName.toLowerCase(),o="a"==r||"area"==r||"input"==r;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),l=i(461),n=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.attributeNonEmpty(l,"role"),o=l.nodeName.toLowerCase();if(!(r=r||("a"==o||"area"==o)&&n.CommonUtil.attributeNonEmpty(l,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=l.getAttribute("onclick").toLowerCase();r=!0;for(var d=0;r&&d<s.length;++d)r=-1==u.indexOf(s[d])}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3022:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),l=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!l.hasAttribute("onchange")&&!l.hasAttribute("onfocus");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},375:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),l=i(461),n=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getChildByTagHidden(l,"optgroup",!1,!0).length>0||n.CommonUtil.getChildByTagHidden(l,"option",!1,!0).length<=10;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},4658:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),l=i(461),n=i(7139),r=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&r.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",n.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(l=r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=n.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!l&&p<s.paramSkipText.value.length;++p)l=-1!=m.indexOf(s.paramSkipText.value[p]);else l=!1}return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},4605:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),l=i(461),n=i(7139),r=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var l,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",n.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(l=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=n.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var _=m.getAttribute("href"),b=_.indexOf("#");-1!=b&&(h=_.substring(b+1))}if(null!=h)for(l=null!=d.getElementById(h),p=0;!l&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(l=!0)}return l?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),l=i(461),n=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase(),o=!0;if("link"===r&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&(o=n.CommonUtil.triggerOnce(l,"style_background_decorative",!1)),o&&"style"===r||l.hasAttribute("style")){var s=("style"===r?n.CommonUtil.getInnerText(l):l.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),l=i(461),n=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=!0;if("style"===l.nodeName.toLowerCase()){for(var o=n.CSSUtil.getCSSStyle(l),s=0;r&&s<o.length;++s)o[s].selector&&(r=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(r)for(var u=0;u<l.ownerDocument.styleSheets.length;u++)if((g=l.ownerDocument.styleSheets[u]).ownerNode===l)try{var d=g.cssRules?g.cssRules:g.rules;if(d)for(var c=0;r&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;r&&h<v.length;h++)null!==(y=v[h]).selectorText&&void 0!==y.selectorText&&(-1===(k=y.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;r&&h<f.length;h++){var _=f[h];if(_.type&&4===_.type){if(v=_.cssRules)for(var b=0;b<v.length;b++)null!==(y=v[b]).selectorText&&void 0!==y.selectorText&&(-1===(k=y.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}else null!==_.selectorText&&void 0!==_.selectorText&&(-1===(k=_.selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=_.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1))}}}catch(e){}}if("link"===l.nodeName.toLowerCase()&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&l.hasAttribute("href")&&0!==l.getAttribute("href").trim().length)for(u=0;u<l.ownerDocument.styleSheets.length;u++){var g;if((g=l.ownerDocument.styleSheets[u])&&g.ownerNode===l)try{var f;if(f=g.cssRules?g.cssRules:g.rules)for(h=0;r&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;r&&b<v.length;b++){var y;if(null!==(y=v[b]).selectorText&&void 0!==y.selectorText){var w=y.selectorText.toLowerCase();-1===w.indexOf(":before")&&-1===w.indexOf(":after")||(C=y.style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var k,C;-1===(k=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===k.indexOf(":after")||(C=f[h].style.content)&&C.trim().length&&'""'!==C.trim()&&"''"!==C.trim()&&"none"!==C.trim()&&"attr(x)"!==C.trim()&&"attr(y)"!==C.trim()&&(r=!1)}}}catch(e){}}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7475:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),l=i(461),n=i(461),r=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(n).toLowerCase();for(var d=0;d<n.ownerDocument.styleSheets.length;d++)if((g=n.ownerDocument.styleSheets[d])&&g.ownerNode===n)try{for(var c=g.cssRules?g.cssRules:g.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var _=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<_.length;b++)u+=_[b].cssText}}catch(e){}}else if(n.hasAttribute("style"))u=n.getAttribute("style").toLowerCase();else if("link"===s&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(d=0;d<n.ownerDocument.styleSheets.length;d++){var g;if((g=n.ownerDocument.styleSheets[d])&&g.ownerNode===n)try{var f=g.cssRules?g.cssRules:g.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),y=u.replace(/-color/g,"").match(/\bcolor\b/i);if(n.hasAttribute("color")||y||A){var w={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in w||null!==a.CommonUtil.getAncestor(n,w))&&n.hasChildNodes())for(var k=new r.DOMWalker(n);!v&&k.nextNode()&&k.node!==n;)v=k.node.nodeName.toLowerCase()in w}return v||(v=o.CacheUtil.getCache(n.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(n.ownerDocument,"style_color_misuse",!0)),v?(0,l.RulePass)("Pass_0"):v?void 0:(0,l.RulePotential)("Potential_1")}}},8064:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),l=i(461),n=i(461),r=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||n.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=r.CSSUtil.getDefinedStyles(s),d=[];d.push(r.CSSUtil.getDefinedStyles(s,":focus")),d.push(r.CSSUtil.getDefinedStyles(s,":focus-visible")),d.push(r.CSSUtil.getDefinedStyles(s,":focus-within"));var c=d[0];if(Object.keys(c).length>0){if(!((u["outline-width"]||u["outline-style"])&&"0px"!==u["outline-width"]&&"none"!==u["outline-style"]||c["outline-style"]&&"none"===c["outline-style"]))return(0,l.RulePass)("pass_focus_visible");var m=!1,p=0;for(var h in c)if(n.checkParams.value.includes(h)){var _=c[h],b=u[h];if(h.includes("style")){if(m="none"===_,b&&"none"!==_&&_===b)return(0,l.RulePotential)("potential_focus_not_visible")}else if(h.includes("width")){if(p++,"initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px"),b&&("initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px")),_=r.CSSUtil.getPixelsFromStyle(_,s),b=r.CSSUtil.getPixelsFromStyle(b,s),0==_||_<=b)return(0,l.RulePotential)("potential_focus_not_visible")}else if(h.includes("color")){p++;var g=o.ColorUtil.ColorCombo(s);if(null===g)continue;var f=g.bg;if(!f)continue;if("initial"===_&&(_="black"),b&&"initial"===b&&(b="black"),_=o.ColorUtil.Color(_),b=o.ColorUtil.Color(b),null===_||null===b)continue;var v=_.contrastRatio(f),A=b.contrastRatio(f);if(v<3||v<=A)return(0,l.RulePotential)("potential_focus_not_visible")}else if(p++,null!=b&&_===b)return(0,l.RulePotential)("potential_focus_not_visible")}if(m&&0===p)return(0,l.RulePotential)("potential_focus_not_visible")}else for(var y in u)if(n.checkParams.value.includes(y)&&"none"!==(b=u[y]))return(0,l.RulePotential)("potential_focus_not_visible");return(0,l.RulePass)("pass_focus_visible")}}},7942:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),l=i(461),n=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase();if("link"===r&&(!l.hasAttribute("rel")||"stylesheet"!==l.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==r&&"link"!==r&&l.hasAttribute("style")&&0===l.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=n.CacheUtil.getCache(l.ownerDocument,"style_highcontrast_visible",!1);return n.CacheUtil.setCache(l.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),l=i(461),n=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=!1,r=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){n.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,_=!1,b="",g=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var y=A.substring(A.indexOf("+")+1);if(y=y.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=y.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){_=!0;var w=A.substring(A.indexOf("~")+1);b=(w=w.trim()).split(" ")[0]}if(!h&&!_)return(0,a.RulePass)("Pass_0");if(b&&(I=y.indexOf("display:"))&&"none;"!==y.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var k=d.cssRules?d.cssRules:d.rules,C=0;C<k.length;C++){var x=c[C].cssText,P=b+" {",R=x.trim(),T=R.indexOf(P);if(R.slice(T).trim(),R.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=x.split(":")[0];if((U=U.split(" ")[0])===b&&x.match(/:hover/g)){var I;if(g=!0,I=x.indexOf("display:"))if(f=!0,"none;"!==y.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var L=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===L[0].nextElementSibling.tagName){l=!0;continue}}else if(h){if(!r){r=!0;break}continue}if(""!==p&&_){L=s.ownerDocument.getElementsByTagName(p.toUpperCase());var E=[],q=L[0].nextElementSibling;do{if(q.tagName!==b.toUpperCase())break;E.push(q)}while(q=q.nextElementSibling);var W=E.length;if(1===W)return(0,a.RulePass)("Pass_2");if(W>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(C===k.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(C===k.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(C===k.length-1&&!1===g)return(0,a.RulePotential)("Potential_1");continue}if(_){if(C===k.length-1&&!1===g)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return l?(0,a.RulePass)("Pass_0"):r?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),l=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,n=!0,r=/\d+(vw|vh|vmin|vmax)/gi,o=l.nodeName.toLowerCase();if("style"===o){for(var s=0;s<l.ownerDocument.styleSheets.length;s++)if((g=l.ownerDocument.styleSheets[s]).ownerNode===l)try{var u=g.cssRules?g.cssRules:g.rules;if(u)for(var d=0;n&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(r);v.length&&p&&(n=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var _=0;n&&_<f.length;_++){var b=f[_];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(r),v.length&&p&&(n=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<l.ownerDocument.styleSheets.length;s++){var g;if((g=l.ownerDocument.styleSheets[s])&&g.ownerNode===l)try{var f;if(f=g.cssRules?g.cssRules:g.rules)for(_=0;n&&_<f.length;_++){var v,A=f[_];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(r),v.length&&p&&(n=!1)}}catch(e){}}else{var y=l.getAttribute("style");y&&(p=y.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(n=!1)}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),l=i(461),n=i(1950),r=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var l=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(l)||r.VisUtil.isNodePresentational(l))return null;var o=n.AccNameUtil.computeAccessibleName(l);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),l=i(461),n=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){e.dom.node;var l=n.CommonUtil.isTableDescendant(i);if(null!==l&&0!==l.length)return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),l[0].role])}}},4:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),l=i(461),n=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;return n.CommonUtil.hasInnerContentHidden(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),l=i(461),n=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;return null!=n.CommonUtil.getAncestor(l,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),l=i(461),n=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node,r=l.rows;if(!n.TableUtil.isDataTable(l)||null===r||0===r.length)return null;var o=n.TableUtil.tableHeaderExists(l);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var l=e.dom.node,d=r.CommonUtil.getAncestor(l,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;l.nodeName.toLowerCase();var m=l.ownerDocument,p=l.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),_=[],b=[],g=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var y=m.getElementById(A);if(y)if(o.DOMUtil.sameNode(y,l))b.push(A);else if(o.DOMUtil.isInSameTable(y,l)){if("th"!==y.nodeName.toLowerCase()){var w=n.AriaUtil.getRoles(y,!0);w.includes("columnheader")||w.includes("rowheader")||f.push(A)}}else g.push(A);else _.push(A)}}var k=[];return 0!=_.length&&k.push((0,a.RuleFail)("Fail_1",[_.toString()])),0!=b.length&&k.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=g.length&&k.push((0,a.RuleFail)("Fail_3",[g.toString()])),0!=f.length&&k.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==k.length?(0,a.RulePass)("Pass_0"):k}}},8142:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),l=i(461),n=i(7139),r=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,s=n.CommonUtil.getAncestor(l,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===r.CacheUtil.getCache(l,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];r.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var _=parseInt(p.getAttribute("rowspan"));_||(_=1);for(var b=0;u[d][b];)b+=1;for(var g=0;g<_;++g){u[d+g]||(u[d+g]=[]);for(var f=0;f<h;++f)u[d+g][b+f]=p}}}var v=l.ownerDocument,A={},y={};for(d=0;d<u.length;++d){var w=!1;for(m=0;m<u[d].length;++m){var k=u[d][m],C=k.nodeName.toLowerCase();if("th"==C){if("row"==k.getAttribute("scope")?(w=!0,n.CommonUtil.attributeNonEmpty(k,"axis")||(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0)):"col"==k.getAttribute("scope")&&(y[m]=!0,n.CommonUtil.attributeNonEmpty(k,"axis")||(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0)),n.CommonUtil.attributeNonEmpty(k,"headers")){var x=k.getAttribute("headers").split(" ");for(g=0;g<x.length;++g)(P=v.getElementById(x[g].trim()))&&n.CommonUtil.getAncestor(P,"table")==s&&(A[r.CacheUtil.getCache(P,"table_headers_related",null)]=!0)}}else if("td"==C)if(w||y[m])A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0;else if(n.CommonUtil.attributeNonEmpty(k,"headers"))for(x=k.getAttribute("headers").split(" "),g=0;g<x.length;++g){var P;(P=v.getElementById(x[g].trim()))&&n.CommonUtil.getAncestor(P,"table")==s&&(A[r.CacheUtil.getCache(k,"table_headers_related",null)]=!0,A[r.CacheUtil.getCache(P,"table_headers_related",null)]=!0)}}}r.CacheUtil.setCache(s,"table_headers_related",A)}var R=r.CacheUtil.getCache(l,"table_headers_related",null),T=r.CacheUtil.getCache(s,"table_headers_related",null),U=R&&T&&R in T;return U||"0:0"!==R||0!=n.CommonUtil.getInnerText(l).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===r.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:r.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),l=i(461),n=i(3946),r=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(l))return null;var o=!r.TableUtil.isLayoutTable(l);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),l=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if("td"===l.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var n=l.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(l))return null;if(s.TableUtil.isDataTable(l))return null;if(n.AriaUtil.isNodeInGrid(l))return null;var u=[];r.CommonUtil.attributeNonEmpty(l,"summary")&&u.push(l);for(var d=l.getElementsByTagName("caption"),c=0;c<d.length;++c)if(r.CommonUtil.getAncestor(d[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=l.getElementsByTagName("th");for(c=0;c<m.length;++c)if(r.CommonUtil.getAncestor(m[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=l.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&r.CommonUtil.getAncestor(p[c],"table")==l){if(r.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=l.nodeName.toLowerCase(),_=new Array,b={};for(c=0;c<u.length;c++){var g=u[c].nodeName.toLowerCase();b.hasOwnProperty(g)||("table"!=g||b.hasOwnProperty.summary?(b[g]=!0,_.push(g)):(b.summary=!0,_.push("summary")))}var f=_.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),l=i(461),n=i(7139),r=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l,s=e.dom.node;if(s.hasAttribute("summary"))l=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=r.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+n.CommonUtil.getInnerText(p).trim().toLowerCase())}}l=d}if(!l)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(l.length>0){var _=n.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return l.includes(_)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),l=i(461),n=i(461),r=i(7507),o=i(4919);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var n=e.dom.node,s=n.nodeName.toLocaleLowerCase(),u=new r.DOMMapper,d=u.getUnadjustedBounds(n);if(!d)return null;if(!a.CommonUtil.isTarget(n))return null;if(d.height>=24&&d.width>=24)return(0,l.RulePass)("pass_sized");var c=o.CSSUtil.getInlineStatus(n);if(null===c)return null;if(c.inline)return c.text?null===c.violation?(0,l.RulePass)("pass_inline"):(0,l.RulePotential)("recommendation_inline",[s,c.violation]):null===c.violation?(0,l.RulePass)("pass_default"):(0,l.RulePotential)("recommendation_inline",[s,c.violation]);if(o.CSSUtil.isTargetBrowserDefault(n))return(0,l.RulePass)("pass_default");var m=n.ownerDocument;if(!m)return null;var p=getComputedStyle(n);if(null===p)return null;var h=p.zIndex;h&&!isNaN(Number(h))||(h="0");var _=m.querySelectorAll("body *:not(script):not(style)");if(_&&0!==_.length){for(var b,g=!0,f=24,v=24,A=null,y=null,w=[],k=function(e){var t=_[e];if(n.contains(t))return g=!1,"continue";if(t.contains(n)||!a.CommonUtil.isTarget(t)||w.some((function(e){return e.contains(t)})))return"continue";var i=u.getUnadjustedBounds(t);if(!i)return"continue";var r="0";if((b=getComputedStyle(t))&&((r=b.zIndex)&&!isNaN(Number(r))||(r="0")),i.top<=d.top&&i.left<=d.left&&i.top+i.height>=d.top+d.height&&i.left+i.width>=d.left+d.width)return(g?parseInt(h)<parseInt(r):parseInt(h)<=parseInt(r))?{value:null}:{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])};if(d.top<=i.top&&d.left<=i.left&&d.top+d.height>=i.top+i.height&&d.left+d.width>=i.left+i.width)return(g?parseInt(h)<parseInt(r):parseInt(h)<=parseInt(r))?{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])}:{value:(0,l.RuleFail)("violation_spacing",[s,t.nodeName.toLowerCase()])};if((d.top>=i.top&&d.top<=i.top+i.height||d.top+d.height<=i.top&&d.top+d.height>=i.top+i.height)&&(d.left>i.left&&d.left<i.left+i.width||i.left>d.left&&i.left<d.left+d.width)||(d.top>i.top&&d.top<i.top+i.height||i.top>d.top&&i.top<d.top+d.height)&&(d.left>=i.left&&d.left<=i.left+i.width||d.left+d.width>=i.left&&d.left+d.width<=i.left+i.width))return{value:(0,l.RulePotential)("potential_overlap",[s,t.nodeName.toLowerCase()])};var o=24,c=24;d.width<24&&(d.top>=i.top&&d.top<=i.top+i.height||d.top<=i.top&&d.top+d.height>i.top)&&(o=Math.min(Math.abs(d.left-i.left),Math.abs(d.left-(i.left+i.width)),Math.abs(d.left+d.width-(i.left+i.width)),Math.abs(d.left+d.width-i.left))),d.height<24&&(d.left>=i.left&&d.left<=i.left+i.width||d.left<=i.left&&d.left+d.width>i.left)&&(c=Math.min(Math.abs(d.top-i.top),Math.abs(d.top-(i.top+i.height)),Math.abs(d.top+d.height-(i.top+i.height)),Math.abs(d.top+d.height-i.top))),o<f&&(f=o,A=t),c<v&&(v=c,y=t),w.push(t)},C=0;C<_.length;C++){var x=k(C);if("object"==typeof x)return x.value}return Math.round(d.width/2)+f<12||Math.round(d.height/2)+v<12?Math.round(d.width/2)+f<Math.round(d.height/2)+v?(0,l.RuleFail)("violation_spacing",[s,A.nodeName.toLowerCase()]):(0,l.RuleFail)("violation_spacing",[s,y.nodeName.toLowerCase()]):(0,l.RulePass)("pass_spacing")}}}},9599:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(r.CommonUtil.isNodeDisabled(l)||!u.VisUtil.isNodeVisible(l))return null;if(null===r.CommonUtil.getAncestor(l,["body"])||null!==r.CommonUtil.getAncestor(l,["script"]))return null;var d=0,c=l.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],_=new o.DOMWalker(l);_.nextNode();for(var b=!1;!b&&_.nextNode()&&_.node!==l&&_.node!==o.DOMWalker.parentNode(l)&&!["br","div","p"].includes(_.node.nodeName.toLowerCase());)if(_.node!==l&&!r.CommonUtil.shouldNodeBeSkippedHidden(_.node)){var g=_.node.nodeName.toLowerCase();if(3===_.node.nodeType){if(_.node.nodeValue.trim().length>0&&_.node.parentElement){var f=getComputedStyle(_.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],_.node.parentElement)>d)){var v=_.node.nodeValue.trim();(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,_.bEndTag=!0}else b=!0}}else if(1===_.node.nodeType)if("b"===g||"strong"===g||"u"===g||"font"===g){var A;v=r.CommonUtil.getInnerText(_.node),(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,_.bEndTag=!0}else{var y=n.AriaUtil.getResolvedRole(_.node);b=null!==y&&"generic"!==y&&"paragraph"!==y&&"strong"!==y||"applet"===g}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),l=i(3946),n=i(3883),r=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!l.VisUtil.isNodeVisible(o)||null!=l.VisUtil.hiddenByDefaultElements&&null!=l.VisUtil.hiddenByDefaultElements&&l.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var _=c.getComputedStyle(p);if(!1==("0"!==_.width&&"0"!==_.height&&"0"!==_.opacity&&"none"!==_.display&&"hidden"!==_.visibility&&"hidden"!==_.overflow&&("auto"===_.left||"absolute"===_.position&&parseInt(_.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===_.left||"absolute"===_.position&&parseInt(_.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==_.clip){var g=_.clip.toString();if(g.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(g)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===_.position&&b<7&&-1!==b)return null;var y=n.ColorUtil.ColorCombo(p);if(null!==y){var w=y.fg,k=y.bg,C=w.contrastRatio(k),x=s.CSSUtil.getWeightNumber(_.fontWeight),P=s.CSSUtil.getFontInPixels(_.fontSize,p),R=P>=24||P>=18.6&&x>=700;s.CSSUtil.containsCKJ(m)&&(R=P>=29.3||P>=24&&x>=700);var T=C>=4.5||C>=3&&R,U=y.hasBGImage||y.hasGradient,I=y.textShadow,L=a.CommonUtil.isNodeDisabled(p);if(!L){var E=a.CommonUtil.getControlOfLabel(p);E&&(L=a.CommonUtil.isNodeDisabled(E))}return!L&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(L=!0),!L&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(L=!0),!T&&L&&(T=!0),T?(0,r.RulePass)("pass",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient]):U?(0,r.RulePotential)("potential_graphic_background",[C.toFixed(2),P,x]):I?(0,r.RulePotential)("potential_text_shadow",[C.toFixed(2),P,x]):w.toHex()===k.toHex()?(0,r.RulePotential)("potential_same_color",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient]):(0,r.RuleFail)("fail_contrast",[C.toFixed(2),P,x,w.toHex(),k.toHex(),y.hasBGImage,y.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;if(null===n.CommonUtil.getAncestor(l,["body"]))return null;for(var o=!0,s=l.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===n.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=n.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=n.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,c=l.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(l)||r.CommonUtil.isNodeDisabled(l)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===r.CommonUtil.getAncestor(l,["body"]))return null;if(null!==r.CommonUtil.getAncestor(l,["script","a","label"]))return null;var m=n.AriaUtil.getResolvedRole(l);if(m){var p=n.AriaUtil.getRolesWithTypes(l,["landmark"]);if(p&&p.includes(m))return null}var h=n.AriaUtil.getRolesWithTypes(l,["widget","heading"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==n.AriaUtil.getAncestorWithRoles(l,h))return null;for(var _="",b="",g=l.firstChild,f="";g;){if("#text"===g.nodeName){var v=g.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}g=g.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,l="(ss+|"+a[0],n=1;n<a.length;++n){var r=a[n].trim().split(" ");if(l+="|"+r[0],r.length>1)for(var s=1;s<r.length;++s)l+=" +"+r[s]}l+=")",i=new RegExp(l,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(l.ownerDocument,"exemptText");f=f.replace(A," "),_=d(l.ownerDocument,"positionText",f),b=d(l.ownerDocument,"otherText",f)}var y=[];return _&&y.push((0,a.RulePotential)("potential_position",[_])),b&&y.push((0,a.RulePotential)("potential_other",[b])),0==y.length?null:y}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,l={},n=[];return i.split(/\s+/).reduce((function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),r=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=r.indexOf(a[o]),u=a[o].length,d=r.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=r.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}r.length!=u&&1!=c&&1!=m||(l.hasOwnProperty(i)||(l[i]=!0,n.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e}),Object.create(null)),n.join(", ")}},1419:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),l=i(461),n=i(7139),r=i(3946),o=i(4919),s=i(7507);t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){var l=e.dom.node;if(l.nodeName.toLowerCase(),r.VisUtil.isNodeHiddenFromAT(l)||n.CommonUtil.isNodeDisabled(l))return null;var u=(new s.DOMMapper).getUnadjustedBounds(l);if(!u)return null;if(u.top<0||u.left<0)return null;if(n.CommonUtil.getAncestor(l,"svg"))return null;for(var d="",c=l.childNodes,m=0;m<c.length;++m)3==c[m].nodeType&&(d+=c[m].nodeValue);if(0==d.trim().length)return null;var p=getComputedStyle(l).getPropertyValue("font-size"),h=parseFloat(p),_=o.CSSUtil.getDefinedStyles(l);if(0===Object.keys(_).length)return null;var b=[],g=/(-?[\d.]+)([a-z%]*)/,f=_["word-spacing"];if(f)if((f.startsWith("inherit")||f.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"word-spacing":["*"]},["inherit","unset"]))?f=o.CSSUtil.getDefinedStyles(w)["word-spacing"]:f.startsWith("unset")&&(f="initial")),"important"===l.style.getPropertyPriority("word-spacing"))if("initial"===(f=f.substring(0,f.length-10-1))||"normal"===f)b.push((0,a.RuleFail)("fail_word_spacing_style"));else{var v=parseFloat(f);isNaN(v)?b.push((0,a.RulePass)("pass")):""!==(C=f.trim().match(g))[2]&&0!==C[1]&&(null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<.16?b.push((0,a.RuleFail)("fail_word_spacing_style")):b.push((0,a.RulePass)("pass")))}else b.push((0,a.RulePass)("pass"));var A=_["letter-spacing"];if(A)if((A.startsWith("inherit")||A.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"letter-spacing":["*"]},["inherit","unset"]))?A=o.CSSUtil.getDefinedStyles(w)["letter-spacing"]:A.startsWith("unset")&&(A="initial")),"important"===l.style.getPropertyPriority("letter-spacing"))if("initial"===(A=A.substring(0,A.length-10-1))||"normal"===A)b.push((0,a.RuleFail)("fail_letter_spacing_style"));else{var y=parseFloat(A);isNaN(y)?b.push((0,a.RulePass)("pass")):""!==(C=A.trim().match(g))[2]&&0!==C[1]&&(null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<.12?b.push((0,a.RuleFail)("fail_letter_spacing_style")):b.push((0,a.RulePass)("pass")))}else b.push((0,a.RulePass)("pass"));var w,k=_["line-height"];if(k&&null===o.CSSUtil.getAncestorWithStyles(l,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]}))if((k.startsWith("inherit")||k.startsWith("unset"))&&(null!==(w=o.CSSUtil.getAncestorWithStyles(l.parentElement,{"line-height":["*"]},["inherit","unset"]))?k=o.CSSUtil.getDefinedStyles(w)["line-height"]:k.startsWith("unset")&&(k="initial")),"important"===l.style.getPropertyPriority("line-height"))if("initial"===(k=k.substring(0,k.length-10-1))||"normal"===k)b.push((0,a.RuleFail)("fail_line_height_style"));else{var C,x,P=parseFloat(k);isNaN(P)?b.push((0,a.RulePass)("pass")):""===(C=k.trim().match(g))[2]?C[1]<1.5?b.push((0,a.RuleFail)("fail_line_height_style")):b.push((0,a.RulePass)("pass")):null!==(x=o.CSSUtil.convertValue2Pixels(C[2],C[1],l))&&x/h<1.5?b.push((0,a.RuleFail)("fail_line_height_style")):b.push((0,a.RulePass)("pass"))}else b.push((0,a.RulePass)("pass"));return b.length>0?b:null}}},855:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),l=i(461),n=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node,r=n.CommonUtil.getAncestor(l,["body","script","code"]);if(null==r||"body"!=r.nodeName.toLowerCase())return null;for(var o=!0,s=l.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),l=i(461),n=i(7011),r=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(l)&&!r.CommonUtil.isNodeDisabled(l)&&!n.AriaUtil.shouldBePresentationalChild(l)){if("datalist"===l.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=n.AriaUtil.getAncestorWithRole(l,m,!0))return null}var p=o.ARIAMapper.nodeToRole(l),h=0;if(r.CommonUtil.isTabbable(l)&&++h,h<1&&!n.AriaUtil.containsPresentationalChildrenOnly(l)&&l.firstChild)for(var _=new s.DOMWalker(l);h<1&&_.nextNode()&&_.node!=l;)1==_.node.nodeType&&!_.bEndTag&&r.CommonUtil.isTabbable(_.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),l=i(461),n=i(3864),r=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(l)&&!o.CommonUtil.isNodeDisabled(l)&&!r.AriaUtil.shouldBePresentationalChild(l)){var c=s.ARIAMapper.nodeToRole(l),m=0;o.CommonUtil.isTabbable(l)&&++m;var p=[];if(m<2&&!r.AriaUtil.containsPresentationalChildrenOnly(l)&&l.firstChild)for(var h=new n.DOMWalker(l);m<2&&h.nextNode()&&h.node!=l;)if(1==h.node.nodeType&&!h.bEndTag&&o.CommonUtil.isTabbable(h.node)){if("input"===h.node.nodeName.toLowerCase()&&"radio"===h.node.getAttribute("type")){var _=h.node.getAttribute("name");if(p.includes(_))continue;p.push(_)}++m}var b=m<2;return b||u.CacheUtil.setCache(l,"widget_tabbable_single","potential_multiple_tabbable"),b?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var a=i(8855),l=i(8601),n=[];for(var r in a)n.push(a[r]);var o={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:l.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:n.filter((function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:l.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:n.filter((function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType})).map((function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:o[e.num]}}))}]},1950:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),l=i(7139),n=i(7011),r=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),r=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==r)return r;var s=n.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:l.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:l.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(r=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;var u=n.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(r=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=l.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||l.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=l.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,n=t.nodeName.toLowerCase();if(l.CommonUtil.form_labelable_elements.includes(n)&&(m=l.CommonUtil.getFormFieldLabel(t))&&""!==m.trim())return{name:l.CommonUtil.truncateText(m),nameFrom:"label"};if("input"===n&&t.hasAttribute("type"))if(l.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=l.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:l.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(_=l.CommonUtil.getElementAttribute(t,"alt"))&&""!==_.trim())return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"};if("button"===n){if((f=t.innerText)&&""!==f.trim())return{name:l.CommonUtil.truncateText(f),nameFrom:"text"};var d=t.querySelector("img");if(d&&!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===n&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(f=i.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"legend"};if("output"===n&&t.hasAttribute("for")){var c=t.getAttribute("for").trim().split(" ");if(c&&c.length>0){for(var m="",p=0;p<c.length;p++){var h=t.ownerDocument.getElementById(c[p]);!h||u.DOMUtil.sameNode(h,t)||r.VisUtil.isNodeHiddenFromAT(h)||r.VisUtil.isNodePresentational(h)||(a=e.computeAccessibleName(h))&&a.name&&a.name.trim().length>0&&(m+=" "+l.CommonUtil.normalizeSpacing(a.name))}if(m.trim().length>0)return{name:l.CommonUtil.truncateText(m),nameFrom:"label"}}}if("summary"===n&&(f=t.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"legend"};if("details"===n)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:l.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===n&&!(b=t.firstElementChild)&&(b=t.lastElementChild)&&"figcaption"===b.nodeName.toLowerCase()&&(f=b.innerText)&&f.trim().length>0)return{name:l.CommonUtil.truncateText(f),nameFrom:"figcaption"};if("img"===n&&t.hasAttribute("alt")){var _=t.getAttribute("alt");return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"}}if("area"===n&&t.hasAttribute("alt")&&(_=t.getAttribute("alt"))&&_.trim().length>0)return{name:l.CommonUtil.truncateText(_),nameFrom:"alt"};if("table"===n){var b,g=t.firstElementChild;if(g&&"caption"===g.nodeName.toLowerCase()&&(b=g.innerText)&&b.trim().length>0)return{name:l.CommonUtil.truncateText(b),nameFrom:"caption"}}if("a"===n){var f;if((f=t.innerText)&&""!==f.trim())return{name:l.CommonUtil.truncateText(f),nameFrom:"text"};var v=t.querySelectorAll(":scope > img, :scope > svg");if(v&&v.length>0){var A="";if(v.forEach((function(t){if(!r.VisUtil.isNodeHiddenFromAT(t)&&!r.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(A+=" "+i.name.trim())}})),""!==A.trim())return{name:A.trim(),nameFrom:"alt"}}}return("optgroup"===n||"option"===n||"track"===n)&&(m=t.getAttribute("label"))&&m.trim().length>0?{name:l.CommonUtil.truncateText(m),nameFrom:"label"}:"svg"===n&&(a=e.computeAccessibleNameForSVGElement(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach((function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}})),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!r.VisUtil.isNodeHiddenFromAT(a)&&!r.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:l.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach((function(e){if("svg"!==e.nodeName.toLowerCase()&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&t.trim().length>0&&(s+=t)}})),""!==s.trim())return{name:l.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=n.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:l.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach((function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}})),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(n.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlostElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:l.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach((function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())})),i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlostElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,n=t.assignedNodes();a<n.length;a++){var r,o=n[a];(r=e.computeAccessibleName(o))&&r.name&&r.name.length>0&&(i+=" "+r.name.trim())}else(r=e.computeAccessibleName(t))&&r.name&&r.name.trim().length>0&&(i+=" "+r.name.trim());return i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;){var n=a.node;if(3===n.nodeType){var o=n.parentElement;!r.VisUtil.isNodeHiddenFromAT(o)&&!r.VisUtil.isNodePresentational(o)&&n.nodeValue&&n.nodeValue.trim().length>0&&(i+=" "+n.nodeValue.trim())}else if(1===n.nodeType&&!r.VisUtil.isNodeHiddenFromAT(n)&&!r.VisUtil.isNodePresentational(n)){var u=e.computeAccessibleName(n);u&&u.name&&u.name.length>0&&(i+=" "+u.name.trim())}}return i.trim().length>0?{name:l.CommonUtil.truncateText(i),nameFrom:"content"}:null},e}();t.AccNameUtil=d},7011:function(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,l=0,n=t.length;l<n;l++)!a&&l in t||(a||(a=Array.prototype.slice.call(t,0,l)),a[l]=t[l]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var l=i(4566),n=i(9910),r=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(5279),c=i(1686),m=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase();"aria-"===l.substring(0,5)&&t.push(l)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase();"aria-"===l.substring(0,5)||t.push(l)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase(),n=e.getAttribute(l);""===n&&(n=null),"aria-"===l.substring(0,5)&&t.push({name:l,value:n})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var l=i[a].name.trim().toLowerCase(),n=e.getAttribute(l);""===n&&(n=null),"aria-"===l.substring(0,5)||t.push({name:l,value:n})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var l=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(l in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][l])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var n=r.ARIAMapper.nodeToRole(t);n in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[n]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[n][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=l.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var n=e.getUserDefinedRoles(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,r),s=!1;if(n&&n.length>0&&o&&o.length>0){for(var d=0;d<n.length;d++)if(o.includes("any")||o.includes(n[d])){if(o.includes("any")&&"generic"===n[d]){s=!0;continue}if(("presentation"===(a=n[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}l.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var l=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),n=0;n<l.length;++n)a.push(l[n]);if(i){var r=e.getImplicitRole(t);null!==r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(r,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=l.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var r=e.getUserDefinedAriaAttributes(t);if(0===r.length)return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=n.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(n.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some((function(e){return r.includes(e)}))){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return l.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(n.ARIADefinitions.designPatterns[e]){var i=n.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var l=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var n=t.getAttribute("role").trim().split(" "),r=0;!l&&r<n.length;++r)l=n[r]in i;else for(n=t.getAttribute("role").trim().split(" "),r=0;!l&&r<n.length;++r)l=n[r]===i;if(!l&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(r=0;!l&&r<o.length;++r)l=o[r]in i;else for(r=0;!l&&r<o.length;++r)l=o[r]===i}return l},e.hasRoleInSemantics=function(t,i){var a=!1,l=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var n=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<n.length;++r)l=!0,a=n[r]in i;else for(n=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<n.length;++r)l=!0,a=n[r]===i;if(l)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(r=0;!a&&r<o.length;++r)a=o[r]in i;else for(r=0;!a&&r<o.length;++r)a=o[r]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var l=e.getImplicitRole(t);null!==l&&l.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var l=o.DOMWalker.parentNode(t);null!==l;){if(a){if(e.hasRoleInSemantics(l,i))break}else if(e.hasRole(l,i,!1))break;l=o.DOMWalker.parentNode(l)}return l},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var l=e.getResolvedRole(a);if(null!==l&&i.includes(l))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=l.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(n.ARIADefinitions.designPatterns).forEach((function(e){var a=e[0],l=e[1];t.includes(l.roleType)&&i.push(a)})),l.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=l.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,r=e.getResolvedRole(t);return r&&"widget"===n.ARIADefinitions.designPatterns[r].roleType&&(a=!0),l.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,l){var n=null,r=!1;if(t&&i){for(n=t.nextSibling;null!==n&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(n)||(r=l?e.hasRoleInSemantics(n,i):e.hasRole(n,i,!1)),n=n.nextSibling;if(!n)for(n=t.previousSibling;null!==n&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(n)||(r=e.hasRole(n,i,l)),n=n.previousSibling}return n},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,l){for(var n=null,r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(r.node))&&(l?e.hasRoleInSemantics(r.node,i):e.hasRole(r.node,i,!1))){n=r.node;break}return n},e.getAllDescendantsWithRoles=function(t,i,a,l){if(i&&0!==i.length){var n=[];return i.forEach((function(i){var r=e.getAllDescendantsWithRoleHidden(t,i,a,l);r&&r.length>0&&(n=n.concat(r))})),n}},e.getAllDescendantsWithRoleHidden=function(t,i,a,l){for(var n=[],r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)r.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(r.node)||e.hasRole(r.node,i,l)&&n.push(r.node);return n},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var l=[];if(null!==t.children&&t.children.length>0)for(var n=0;n<t.children.length;n++)l.push(t.children[n]);var r=t.getAttribute("aria-owns");if(r){var o=t.ownerDocument;if(o){var u=r.split(" ");for(n=0;n<u.length;n++){var d=o.getElementById(u[n]);d&&l.push(d)}}}if(l.length>0){for(n=0;n<l.length;n++)if(!s.VisUtil.isNodeHiddenFromAT(l[n])&&s.VisUtil.isNodeVisible(l[n])){var c=e.getRoles(l[n],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(l[n])),c&&null!==c&&c.length>0&&(c=c.filter((function(e){return"none"!==e&&"presentation"!==e}))).includes("group")&&i&&i.includes("group")&&(c=c.filter((function(e){return"group"!==e}))),c&&null!==c&&c.length>0?a.push(l[n]):e.retrieveDirectATChildren(l[n],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var l=["none","presentation"];if(a.some((function(e){return l.includes(e)})))return null;for(var r=n.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)r[a[s]]&&null!==r[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(r[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,l){var n=null,r=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(n=d.FragmentUtil.getById(t,o),c.DOMUtil.sameNode(t,n))return null;r=a&&null!=n&&u.CommonUtil.shouldNodeBeSkippedHidden(n)?null:e.hasRole(n,i,l)}return r?n:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(e,t){if(0===e.length)return!1;var i=e[0].ownerDocument,a=!1,n=null;t&&(n=l.CacheUtil.getCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===n&&(n={});for(var r=0;!a&&r<e.length;++r)if(e[r].hasAttribute)if(e[r].hasAttribute("aria-label")){var o=u.CommonUtil.normalizeSpacing(e[r].getAttribute("aria-label")).toLowerCase();a=o in n,n[o]=!0}else if(e[r].hasAttribute("aria-labelledby")){var s=e[r].getAttribute("aria-labelledby"),m=d.FragmentUtil.getById(e[r],s),p=m&&!c.DOMUtil.sameNode(m,e[r])?u.CommonUtil.getInnerText(m):"",h=u.CommonUtil.normalizeSpacing(p).toLowerCase();a=h in n,n[h]=!0}else a=!0;return t&&l.CacheUtil.setCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",n),!a},e.getAriaLabel=function(e){if(e.hasAttribute){if(e.hasAttribute("aria-labelledby")){for(var t=e.getAttribute("aria-labelledby").trim().split(" "),i="",a=0,l=t.length;a<l;++a){var n=t[a],r=d.FragmentUtil.getById(e,n),o=r&&!c.DOMUtil.sameNode(r,e)?u.CommonUtil.getInnerText(r):"";i+=u.CommonUtil.normalizeSpacing(o).toLowerCase()}return i.trim()}if(e.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(e.getAttribute("aria-label")).toLowerCase().trim()}return""},e.getAriaDescription=function(e){if(!e)return"";var t="",i=e.getAttribute("aria-labelledby");if(i&&i.trim().length>0){for(var a=i.trim().split(" "),l=0,n=a.length;l<n;++l){var r=a[l],o=d.FragmentUtil.getById(e,r),s=o&&!c.DOMUtil.sameNode(o,e)?u.CommonUtil.getInnerText(o):"";s&&s.trim().length>0&&(t+=u.CommonUtil.normalizeSpacing(s).toLowerCase())}if(t.trim().length>0)return t.trim()}return(i=e.getAttribute("aria-description"))&&i.trim().length>0?i.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach((function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1})),i},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(e,t){if(0===e.length)return!1;var i=e[0].ownerDocument,a=null,n=new Array;t&&(a=l.CacheUtil.getCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===a&&(a={});for(var r=0;r<e.length;++r)if(e[r].hasAttribute)if(e[r].hasAttribute("aria-label")){var o=u.CommonUtil.normalizeSpacing(e[r].getAttribute("aria-label")).toLowerCase();a[o]=!0,o in n||(n[o]=new Array),n[o].push(e[r].nodeName.toLowerCase())}else if(e[r].hasAttribute("aria-labelledby")){for(var s=e[r].getAttribute("aria-labelledby").trim().split(" "),m="",p=0,h=s.length;p<h;++p){var _=s[p],b=d.FragmentUtil.getById(e[r],_),g=b&&!c.DOMUtil.sameNode(b,e[r])?u.CommonUtil.getInnerText(b):"";m+=u.CommonUtil.normalizeSpacing(g).toLowerCase()}a[m]=!0,m in n||(n[m]=new Array),n[m].push(e[r].nodeName.toLowerCase())}return t&&l.CacheUtil.setCache(i,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",a),n},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var l=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=l in i,i[l]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=l.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var r=null;if(t.tagName?r=t.tagName.toLowerCase():t.nodeName&&(r=t.nodeName.toLowerCase()),null==(i=n.ARIADefinitions.documentConformanceRequirement[r])){var o=n.ARIADefinitions.documentConformanceRequirementSpecialTags[r];switch(r){case"a":case"area":i=u.CommonUtil.attributeNonEmpty(t,"href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,m=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==m&&m.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=n.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&c.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()}))[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":i=null!==e.getAncestorWithRole(t,"table",!0)||null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===u.CommonUtil.getScopeForTh(t)?o["des-table-grid-treegrid-column-scope"]:o["des-table-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var _=t.parentElement;i=null!==_&&"dl"===_.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=n.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return l.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=l.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var n;if(null!=(n=null!=i?i:e.getElementAriaProperty(t))){null!==n.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(n.implicitRole,a),null!==n.validRoles&&u.CommonUtil.concatUniqueArrayItemList(n.validRoles,a);var r=e.getImplicitRole(t);r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(n.validRoles,a)}l.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,r){var o=l.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];n.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),n.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),n.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=r&&void 0!==r?r:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=n.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var _=h.props;u.CommonUtil.concatUniqueArrayItemList(_,o),_=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(_,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=n.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var g=n.ARIADefinitions.designPatterns[s[p]];if(null!=g){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=g.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=g.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var y=[],w=0;w<m.otherAllowedAriaAttributes.length;w++)if((x=m.otherAllowedAriaAttributes[w]).includes("=")){var k=x.split("=");t.getAttribute(k[0])===k[1]&&y.push(k[0])}else y.push(x);y.length>0&&u.CommonUtil.concatUniqueArrayItemList(y,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var C=[];for(w=0;w<m.otherDisallowedAriaAttributes.length;w++){var x;(x=m.otherDisallowedAriaAttributes[w]).includes("=")?(k=x.split("="),t.getAttribute(k[0])===k[1]&&C.push(k[0])):C.push(x)}C.length>0&&u.CommonUtil.concatUniqueArrayItemList(C,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),l.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=n.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var l=[],r=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;r=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;r=a.overlapping}for(var o=!1,s=!1,u=0;u<r.length;u++)for(var d=r[u].ariaAttributeValue,c=r[u].htmlAttributeNames,m=r[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var _=null===m||null===m[h]?null:m[h].split(",");null===d?(null===_||_.includes(t[p].value))&&(l.push({result:"Failed",attr:t[p].name}),s=!0):null===_?d===e.value&&(l.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&_.includes("VALUE")&&_[0]!==e.value||d===e.value&&_.includes(t[p].value))&&(l.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&l.push({result:"Pass",attr:""}),l}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var l=n.ARIADefinitions.designPatterns[i[a]];if(null!=l&&!0===l.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=r.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=n.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),l=e.getAllowedAriaRoles(t,a);if(!l||0===l.length)return i;var n=[];if(l.includes("any"))return[];for(var r=0;r<i.length;r++)l.includes(i[r])||n.includes(i[r])||n.push(i[r]);return n},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var l=n.ARIADefinitions.designPatterns,r=0;r<i.length;r++)i[r]in l||a.push(i[r]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var l=[];i&&0!=i.length||(i=e.getImplicitRole(t));var n=e.getUserDefinedAriaAttributes(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,r);if(n)for(var s=0;s<n.length;s++){var u=n[s].trim().toLowerCase();o.includes(u)||l.includes(u)||l.push(u)}return l},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),l=[];if(i&&i.length>0&&a&&a.length>0)for(var n=function(t){var n=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===n)return"continue";n.forEach((function(e){"Failed"===e.result&&l.push({ariaAttr:i[t].name,htmlAttr:e.attr})}))},r=0;r<i.length;r++)n(r);return l},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var l=n.ARIADefinitions.globalDeprecatedRoles,r=0;r<i.length;r++)l.includes(i[r])&&a.push(i[r]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var l=0;l<i.length;l++){var r=i[l].name;"aria-"===r.substring(0,5)&&a.push(r)}if(0===a.length)return[];var o=[],s=n.ARIADefinitions.globalDeprecatedProperties;for(l=0;l<a.length;l++)s.includes(a[l])&&o.push({role:"any",attribute:a[l]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(l=0;l<u.length;l++){var d=n.ARIADefinitions.designPatterns[u[l]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[l],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=m},4919:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),l=i(7139),n=i(7011),r=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){try{if(""===t.trim())return!1;if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);for(var i=(e.document||e.ownerDocument).querySelectorAll(t),a=0;a<i.length&&i[a]!==e;)++a;return a<i.length}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getDefinedStyles=function(t,i){if(!t)return null;var l={},n={};function r(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,l=e;a<l.length;a++){var n=l[a];for(var r in n)delete n[r]}break}r=t[i];for(var o=0,s=e;o<s.length;o++){n=s[o];var u=t.getPropertyPriority(r);if(r in n&&n[r].endsWith("!important")){if("important"!==u||n[r].startsWith("inherit")||n[r].startsWith("unset"))continue;n[r]=t[r]+" !important"}else n[r]=t[r]+("important"===u?" !important":"")}}}var o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);if(!i&&o)l=o.definedStyles,n=o.definedStylePseudo;else{for(var s=0;s<t.ownerDocument.styleSheets.length;++s){var u=t.ownerDocument.styleSheets[s];try{if(u&&u.cssRules)for(var d=0;d<u.cssRules.length;++d){var c=u.cssRules[d],m=c.selectorText;if(m){var p=m.match(/^(.*)(:[a-zA-Z-]*)$/),h=!!p,_=h?p[1]:m,b=(h?p[2]:"")===i;i&&":focus"===i&&(_=_.replace(/([ >][^+~ >]+):focus-within/g,"$1")),!h&&e.selectorMatchesElem(t,_)&&r([l,n],c.style),b&&e.selectorMatchesElem(t,_)&&r([n],c.style)}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}r([l,n],t.style),a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",{definedStyles:l,definedStylePseudo:n})}if(i){for(var g in n)n[g]===l[g]&&delete n[g];return n}return l},e.getMediaOrientationTransform=function(e){for(var t={},i=0;i<e.styleSheets.length;++i){var a=e.styleSheets[i];try{if(a&&a.cssRules)for(var l=0;l<a.cssRules.length;++l){var n=a.cssRules[l];if(4===n.MEDIA_RULE){var r=n;if(r&&r.media)for(var o=r.media,s=0;s<o.length;s++)if(o.item(s)){var u=t[o.item(s).toLocaleLowerCase()];u||(u={});for(var d=r.cssRules,c=0;c<d.length;++c){if(1===d[c].STYLE_RULE){var m=d[c],p=m.selectorText;if(p)for(var h={},_=m.style,b=0;b<_.length;++b){var g=_[b];if("transform"===g.toLocaleLowerCase()){if("all"===g&&_[g]){delete h[g];break}h[g]=_[g]}else"rotate"===g.toLocaleLowerCase()&&(h[g]=_[g]);u[p]=h}}o.item(c)&&(t[o.item(c).toLocaleLowerCase()]=u)}}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return t},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var l=i[a].trim();if(""!==l)if(l.startsWith("rotate3d")){var n=l.indexOf("("),r=l.indexOf(")");if(-1!==n&&-1!==r){var o=l.substring(n+1,r),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(l.startsWith("rotate")||l.startsWith("rotateZ")){if(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r){var d;if(!(d=l.substring(n+1,r)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(l.startsWith("matrix3d")){if(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r&&(o=l.substring(n+1,r),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else l.startsWith("matrix")&&(n=l.indexOf("("),r=l.indexOf(")"),-1!==n&&-1!==r&&(o=l.substring(n+1,r),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var l=e.convertValue2Pixels(a[2],a[1],i);return null===l?l:parseFloat(l)},e.convertValue2Pixels=function(e,t,i){if(0==t)return 0;var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t)["font-family"],l=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(l=!0),!l){var n=t.classList;for(var r in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(n.contains(r)){l=!0;break}}if(!l)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var l=t.substring((""+a).length);return e.convertValue2Pixels(l,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var l={},n=void 0;null!=(n=i.exec(t));)l[n[1]]=n[2].trim().toLowerCase();var r=[{selector:null,values:l}];return e.IBM_CSS_THB=r,r}r=[],n=void 0;for(var o=void 0;null!=(n=a.exec(t));){l={};for(var s=n[1],u=n[2];null!=(o=i.exec(u));)l[o[1]]=o[2].trim().toLowerCase();r.push({selector:s,values:l})}return e.IBM_CSS_THB=r,r},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var n=new r.DOMMapper,o=n.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return l.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(l.CommonUtil.isTarget(e)&&o.width<24){var a=n.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return l.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=n.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,l){void 0===l&&(l=[]);for(var n=t;null!==n;){var r=a.CacheUtil.getCache(n,"AriaUtil_AncestorWithStyles",null);if(r)return r;var s=e.getDefinedStyles(n);for(var u in i){var d=s[u];if(d&&(d=d.split(" ")[0],!l.includes(d))){if(i[u].includes("*"))return a.CacheUtil.setCache(n,"AriaUtil_AncestorWithStyles",n),n;if(i[u].includes(d))return a.CacheUtil.setCache(n,"AriaUtil_AncestorWithStyles",n),n}}n=o.DOMWalker.parentElement(n)}return a.CacheUtil.setCache(t,"AriaUtil_AncestorWithStyles",void 0),null},e}();t.CSSUtil=s},4566:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(3864),l=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.clearCaches=function(e){delete e.ownerDocument.aceCache;var t=new a.DOMWalker(e,!1,e,!0);do{delete t.node.aceCache,t.node.ownerDocument&&delete t.node.ownerDocument.aceCache}while(t.nextNode())},e}();t.CacheUtil=l},3883:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),l=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new n(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new n(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new n(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var l=parseInt(t.substring(1,3),16),r=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new n(l,r,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var l=i.defaultView;if(!l)return null;for(var n=[],r=t;r;)1===r.nodeType&&n.push(r),r=a.DOMWalker.parentElement(r);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=l.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,l=null,n=1;n<e.length;++n){for(var r=e[n-1],o=i.contrastRatio(e[n-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[n].mix(e[n-1],u+s).getOverlayColor(t));)r=e[n].mix(e[n-1],u+s).getOverlayColor(t),o=i.contrastRatio(r),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[n].mix(e[n-1],u-s).getOverlayColor(t));)r=e[n].mix(e[n-1],u-s).getOverlayColor(t),o=i.contrastRatio(r),u-=s;s/=10}(null===l||l>o)&&(l=o,a=r)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,_=null;n.length>0;){var b,g=n.pop();if(null!==(b=l.getComputedStyle(g))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],y=0;y<v.length;++y)if(v[y].length){var w=e.Color(v[y]);if(void 0!==w.alpha&&w.alpha<1){var k=_||m;w=w.getOverlayColor(k)}A.push(w)}else v.splice(y--,1);f=c(A,_||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=_&&(_.alpha=p*h,m=_.getOverlayColor(m)),p=1,h=null,_=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(_=f).alpha||1,delete _.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===_?(h=(_=f).alpha||1,delete _.alpha):h=(_=f.getOverlayColor(_)).alpha||1,1===p&&1===h&&1===(_.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=_&&delete(u=u.getOverlayColor(_)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=_&&(_.alpha=p*h,m=_.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=l;var n=function(){function e(e,t,i,a){function l(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=l(e),this.green=l(t),this.blue=l(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var l in e)a+=l+"\n";alert(e),alert(a)}var n=e.relativeLuminance();return i>n?(i+.05)/(n+.05):(n+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,l=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*l)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,n=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var r=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(r)))return null;i=o[1],a=o[2],n=o[3]}else if(t.startsWith("rgba(")){var o;if(r=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(r)))return null;i=o[1],a=o[2],n=o[3]}else{if("#"!=t.charAt(0)){if(!(t in l.CSSColorLookup))return null;t=l.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),n=s(t.substring(5,7))}return new e(i,a,n)},e}();t.ColorObj=n},7139:function(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,l=0,n=t.length;l<n;l++)!a&&l in t||(a||(a=Array.prototype.slice.call(t,0,l)),a[l]=t[l]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var l=i(9910),n=i(4566),r=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!!t.hasAttribute("contenteditable")},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!r.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter((function(e){return["table","grid","treegrid"].includes(e.role)})):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var l=i.split(" "),n=t.ownerDocument,r=0;r<l.length;r++){var o="//*[@id='"+l[r]+"']";n.evaluate(o,t,n.defaultNSResolver,0,null).iterateNext()||(a+=l[r]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=n.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),n.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,l){for(var n=[],r=t.firstChild;null!=r;){if(r.nodeName.toLowerCase()===i){if((a||l&&!e.shouldCheckHiddenContent(r))&&!s.VisUtil.isNodeVisible(r)){r=r.nextSibling;continue}n.push(r)}r=r.nextSibling}return n},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,l){var o=null;if(null===(o=l?n.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):n.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&l){var m=r.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}l?n.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):n.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var _=i;(i=[]).push(_)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var g=0;g<b.length;++g)h.push(b[g])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=r.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===r.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var l=t.nodeName.toLowerCase();if("object"!=l&&"embed"!=l&&"a"!=l&&"area"!=l)return!1;var n=!1;if(!n&&t.hasAttribute("type")&&(n=a(t.getAttribute("type").toLowerCase())),!n&&t.hasAttribute("codetype")&&(n=a(t.getAttribute("codetype"))),!n){var r="";"embed"===l?r=t.getAttribute("src"):"a"===l||"area"===l?r=t.getAttribute("href"):t.hasAttribute("data")&&(r=t.getAttribute("data")),null===r&&(r=""),n=i(e.getFileExt(r))}if(!n&&"object"===l)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!n&&null!=o&&s<o.length;++s)n=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return n},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,(function(e){return e.startsWith("audio")}))},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,(function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")}))},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,(function(e){return e.startsWith("image")}))},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return n.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=n.CacheUtil.getCache(e,t,!1);return n.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var l in t)if(t[l]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var l=new d.DOMWalker(a);l.nextNode();)if(l.node&&1===l.node.nodeType&&l.elem()&&(l.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(l.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!n.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var l={},r=e.getDocElementsByTag(t,"label"),o=0;o<r.length;++o)if(r[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(r[o]))continue;l[r[o].getAttribute("for")]=r[o]}n.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",l)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return n.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!l.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),n=!1,r=0;a<a.length;++r){var o=document.getElementById(a[r]);if(o&&!u.DOMUtil.sameNode(o,e)){n=!0;break}}return n?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var l=e.getInnerText(a);return l&&""!==l.trim()?l.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,l=e.getLabelForElementHidden(t,!0);if(l)a=l.innerText;else{if(!(l=e.getAncestor(t,"label"))||"label"!==l.tagName.toLowerCase()||!e.isFirstFormElement(l,t))return null;var n=l.cloneNode(!0);n=e.removeAllFormElementsFromLabel(n),a=e.getInnerText(n)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(l,!0))&&""!==a.trim()&&(i+=a.trim()),(a=r.AriaUtil.getAriaLabel(l))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,l=0;l<t.children.length;l++){var n=t.children.item(l);if(e.form_labelable_elements.includes(n.nodeName.toLowerCase())){a=n;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=r.AriaUtil.getResolvedRole(p);if("textbox"===h){var _=p.getAttribute("value");_&&_.trim().length>0&&(m+=" "+_.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var g=p.ownerDocument.getElementById(b);if(g&&!u.DOMUtil.sameNode(p,g)){var f=o.AccNameUtil.computeAccessibleName(g);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=r.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,l=i.length;a<l;++a){var n=c.FragmentUtil.getById(e,i[a]);if(n&&u.DOMUtil.sameNode(n,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),l=e.nodeDepth(i);if(l>a){for(var n=0;n<l-a;++n)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>l){for(n=0;n<a-l;++n)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var l=0;l<i[a].frames.length;++l)try{i[a].frames[l]&&!i.includes(i[a].frames[l])&&i.push(i[a].frames[l])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var l=0,n=t.assignedNodes();l<n.length;l++){var r=n[l];a=a&&e.isInnerTextEmpty(r)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(e){if(!e)return null;if(3===e.nodeType)return e.nodeValue();for(var t="",i=new d.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){if(1===i.node.nodeType&&s.VisUtil.hiddenByDefaultElements.includes(i.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(i.node)||s.VisUtil.isElementOffscreen(i.node)){if(i.node.nextSibling){3===i.node.nextSibling.nodeType&&null!==i.node.nextSibling.nodeValue&&(t+=i.node.nextSibling.nodeValue),i.node=i.node.nextSibling;continue}break}3===i.node.nodeType&&null!==i.node.nodeValue&&(t+=i.node.nodeValue.trim())}return t.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode();)a="img"===l.node.nodeName.toLowerCase()&&e.attributeNonEmpty(l.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode()&&l.node!=t;){var n=l.node;if(!((a="img"===n.nodeName.toLowerCase()&&(e.attributeNonEmpty(n,"alt")||e.attributeNonEmpty(n,"title"))&&!s.VisUtil.isNodeHiddenFromAT(n)&&!s.VisUtil.isNodePresentational(n)||"svg"===n.nodeName.toLowerCase()&&e.svgHasName(n))||1!==n.nodeType||s.VisUtil.isNodeHiddenFromAT(n)||s.VisUtil.isNodePresentational(n)||(a=!e.isInnerTextOnlyEmpty(n))||!0!==i)){a=e.attributeNonEmpty(n,"aria-label")||e.attributeNonEmpty(n,"aria-labelledby");var r=n.ownerDocument;if(r){var o=r.defaultView;if(o){var u=o.getComputedStyle(n);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(n,"alt"))}}}3===n.nodeType&&d.DOMWalker.parentElement(n)===t&&(a=!e.isInnerTextEmpty(n))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var l=new d.DOMWalker(t);!a&&l.nextNode()&&l.node!=t;)!(a="img"===l.node.nodeName.toLowerCase()&&e.attributeNonEmpty(l.node,"alt"))&&(r.AriaUtil.hasRole(l.node,"button",!0)||r.AriaUtil.hasRole(l.node,"textbox"))&&(r.AriaUtil.hasAriaLabel(l.node)||e.attributeNonEmpty(l.node,"title")||e.getLabelForElementHidden(l.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter((function(t){return!e.includes(t)})):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=function(e){return a([],e.parentElement.children,!0).filter((function(e){return 1===e.nodeType&&"TH"!=e.tagName}))};return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},l=t;l;){if(1===l.nodeType){var n=l;n.hasAttribute("id")&&(a[n.getAttribute("id")]=!0)}l=d.DOMWalker.parentNode(l)}for(var r=t.ownerDocument.querySelectorAll("*[aria-labelledby]"),o=0;o<r.length;++o)for(var s=r[o],u=0,m=s.getAttribute("aria-labelledby").split(" ");u<m.length;u++)if(m[u]in a&&!e.isIdReferToSelf(t,t.getAttribute("aria-labelledby")))return s;return null},e.isNodeDisabled=function(t){var i=n.CacheUtil.getCache(t,"PT_NODE_DISABLED",!1);3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),r=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||r&&l.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,n.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),n.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=60),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){return"hidden"!==e.getAttribute("type")&&!e.hasAttribute("disabled")},select:function(e){return!e.hasAttribute("disabled")},textarea:!0,a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()}))[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter((function(e){return"summary"===e.nodeName.toLowerCase()})).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),l=i(7011),n=i(7139),r=function(){function e(){}return e.isDataTable=function(e){return!(l.AriaUtil.hasRole(e,"none")||l.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,l=null,r=t.getElementsByTagName("tr"),o=r.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=r[c].getElementsByTagName("th"),l=r[c].getElementsByTagName("td"),u=a.length,0!==(s=l.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&n.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(l[p].hasAttribute("rowspan")||l[p].hasAttribute("colspan")||l[p].hasAttribute("headers")&&n.CommonUtil.normalizeSpacing(l[p].getAttribute("headers")).split(" ").length>2)&&n.CommonUtil.getAncestor(l[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),_=h.length;_>0&&((i=_>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,l=0;i&&l<t.cells.length;l++){var n=t.cells[l];i=e.isTableCellEmpty(n)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,l=i[0],r=0;a&&r<i.length;r++)(l=i[r]).parentNode&&"tfoot"===l.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(l));if(a)return null;for(a=!0,r=0;a&&r<l.cells.length;r++){var o=l.cells[r];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(r=0;a&&r<i.length;r++)for(var c=i[r],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?n.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&n.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every((function(e){return u.includes(e)})))},e.isLayoutTable=function(e){return l.AriaUtil.hasRole(e,"presentation")||l.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter((function(e){return["table","grid","treegrid"].includes(e.role)})):null},e}();t.TableUtil=r},3946:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),l=i(1686),n=i(3864),r=i(7507),o=i(7011),s=i(4919),u=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=n.DOMWalker.parentNode(t));var i,l=t;if(a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",!1)),1!==l.nodeType)return!0;if(!l.ownerDocument)return!0;var r=l.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(r)>-1)return!1;if(null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(r)){if(!l.ownerDocument.defaultView)return!0;i=l.ownerDocument.defaultView.getComputedStyle(l,null);var o=l.getAttribute("hidden"),s=a.CacheUtil.getCache(l,"PT_NODE_HIDDEN",void 0),u="boolean"==typeof l.hidden&&l.hidden;if(!i&&!u&&null==o&&!s)return!0;if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(l,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(u||null!=o||s))return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),!1;if(e.isContentHidden(l))return a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),!1}var d=n.DOMWalker.parentNode(l);if(null!=d&&1===d.nodeType){a.CacheUtil.setCache(d,"Visibility_Check_Parent",!0);var c=e.isNodeVisible(d);return c||a.CacheUtil.setCache(l,"PT_NODE_HIDDEN",!0),c}return!0},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,l=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===l){var r=s.CSSUtil.getDefinedStyles(i);if("absolute"===r.position&&r.clip&&"rect(0px,0px,0px,0px)"===r.clip.replaceAll(" ","")||r.opacity&&parseFloat(r.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=n.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return l},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new r.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?l.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=u},8855:e=>{e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":[],"scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}},t={};function i(a){var l=t[a];if(void 0!==l)return l.exports;var n=t[a]={exports:{}};return e[a].call(n.exports,n,n.exports,i),n.exports}var a={};(()=>{var e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var l=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return l.Checker}});var n=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return n.ARIAMapper}});var r=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return r.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}}),String.prototype.startsWith=String.prototype.startsWith||function(e){return 0===this.indexOf(e)},String.prototype.includes=String.prototype.includes||function(e){return-1!==this.indexOf(e)},Array.prototype.includes=Array.prototype.includes||function(e){return-1!==this.indexOf(e)},e.checkDemo=function(e){e||(e=0);var t=new l.Checker;setTimeout((function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then((function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort((function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)}));for(var a=null,l=null,n=0,r=e.results;n<r.length;n++){var o=r[n];l!==o.category&&(null!==l&&(console.groupEnd(),console.groupEnd(),a=null),l=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()}))}),e)}})(),ace=a})(); \ No newline at end of file